@54814b2f that sounds rather ominous 😄 Jokes apart, in terms of expressiveness I fully agree. But what about the features that will never be implemented? Getting pattern matching, for example, on Java seemed already an astronomical leap forward. So what could be the ones that will never make it?
@fd32800e I don't think we'll ever see Scala's implicit parameters or metaprogramming facilities. Or Kotlin's context receivers, or compiler plugins. This is because Java prefers runtime reflection, and even though GraalVM's native-image is now a problem, they'll rather do something to make runtime reflection more compatible, instead of introducing new ways of doing things. The more Java evolves, the more it stays the same. This is a strength (backwards compat 💪), but also a weakness.
@fd32800e And you can infer Java's direction from its history. Java, for better or worse, evolved in tandem with the runtime. This is in many ways a strength. E.g., Java's records have a semantic for the runtime that Scala's case classes cannot have. Virtual threads leave the language untouched, etc. Java is tied to the JVM, JVM improvements lift all boats, but Scala & Kotlin are free to directly target other platforms (JS, wasm, native), which also pushes them to compile-time solutions.