Universal Generics Would Allow Java Type Variables to Range Over Primitive and Reference Types, Making It Easier to Extend or Reuse Code Across Different Types
Java could get universal generics under OpenJDK proposals intended to make the language simpler to use, although the plan itself would take years to bring to fruition.
Universal generics would be delivered initially through three proposals floating in the OpenJDK community. Together, the proposals would dramatically change the Java language and the JVM, combining the flexibility of classes and the performance of primitives, according to Oracle. Everything, including primitives, would become an object. But instead of making primitives less performant, the path chosen would make classes as performant as primitives.
Each of the three JDK Enhancement Proposals (JEP) delivers different functionality, but all three would be needed to gain the expected benefits. Chief among these is a JEP draft, created in February and updated October 29, that calls for unifying the treatment of reference and primitive value types in generic code by allowing Java type variables to range over both kinds of types. New warnings would be produced to maintain the safety guarantees of generic code.
A second JEP, to enhance the Java object model with user-declared primitive objects, would serve as a prerequisite. A third JEP, to unify basic primitives with objects, is expected to proceed as well. Additional JEPs would follow to update standard libraries, addressing null warnings and making libraries specialization-ready, and to introduce runtime specialization of generic APIs in the JVM.
The universal generics plan promotes having generic APIs directly support primitive value types, for operating directly on custom-defined primitives. Reference types also would be supported. This ideally should be the default behavior of Java’s generics, so primitive value types can participate fully in the Java ecosystem, the proposal states. There currently is no date set on when universal generics would appear in Java, but it would require multiple years to bring to fruition.
Universal generics would extend existing generics capabilities in the platform. Java 2 Platform, Standard Edition 5.0, introduced in 2004, brought generics to the language and platform, allowing developers to identify what they want to store in a collection and making iterators type safe. But with the 2004 iteration of generics, developers could generify only over reference types. By unifying primitives with references, a next step could be taken that allows type parameters to be ranged over all types.