There's a huge inertia to "strictly wrong, but already existing", so there is a bias to keep maintaining those things.
(And there are - at least - hundreds of thousands of programmers with huge status quo biases. We saw this mostly as C started to lose a lot of ground, finally, to safer languages with infinitely better tooling. It's that too many people put up with bad bad tools, mostly because they prefer very very incremental changes, and mostly those that give them results in "functional requirements".)
Wild statement. Java certainly was incredibly innovative upon release. It didn’t explode in popularity by accident.
I get the feeling Java seems to have suffered from its early success, pioneering things like generics in GC languages, which competitors like C# were able to do better, but only because Microsoft decided to break compatibility between .NET 1 and .NET 2 or because there was no compatibility to break. After that, the language seems to have shyed away from innovation out of fear of breaking things for a long time.
In recent years, this has changed, but Java has a lot of language features to catch up on. Project Loom (green threading without coloured functions) is the first innovative thing I've seen Java do in recent history.
Here is a list of GC languages with generics that predated Java:
CLU, ML, Standard ML, Caml Light, OCaml, Miranda, Haskell, Sather, Eiffel, Modula-2+, Modula-3.
Core Java was staunchly against incorporating any functional features while the rest of the ecosystem was innovating
> Java is not an innovative language and the fact it is evolving towards something better...
So basically C#?• The feature is compile-time only (unsurprising considering the type narrowing approach is very similar to how TypeScript works)
• It interacts weirdly with Nullable<T> for structs since that already came before, uses some of the same syntax, but works differently because it's actually a type at runtime.
Java seems to have the nice position here to make it consistent across value types and reference types (assuming Project Valhalla is ever done) and they seem to have opted to retain the types at runtime as well which will cause runtime checks. This may cause gripes about performance, but from a correctness standpoint it's definitely much nicer than just having APIs that tell you that null won't ever occur, only to still have that problem in certain cases.
Just like 60% of Azure runs Linux workloads, as per official numbers.
Interesting the rounds that the world makes.
Most of the innovation when it comes to concurrency, garbage collection, JIT did come from Java. Syntax - that's more of an opinion/preference.
My gripe with yet another "improvement" of the language is still the lack of headerless objects (aka value classes) - JEP 401[0]