The main reason why I don’t use Kotlin more is because it’s not as stable as Java. A lot of the stuff like error handling or overload resolution isn’t defined in the docs, and is either already different between different Kotlin variants (JVM/JS/Native) or is going to change between versions. IMO it’s not really acceptable if "Hello"[-1]
suddenly returns an invisible 0-char instead of previously throwing an exception for example.
I also agree that companion objects don’t feel like they are the best design possible, to say it nicely, especially the requirement that you need a dummy companion object to create type/“static” extension methods is very limited IMO. Otherwise they just make Java interop more difficult and usually don’t add anything of value that regular Java-like static methods inside a class wouldn’t also give you. I’ve practically never seen the need to pass a companion object around as an object or let it implement an interface.