Why do generics in Java work with classes but not with primitive types?
For example, this works fine:
List<Integer> foo = new ArrayList<Integer>();
but this is not allowed:
List<int> bar = new ArrayList<int>();
Why do generics in Java work with classes but not with primitive types?
For example, this works fine:
List<Integer> foo = new ArrayList<Integer>();
but this is not allowed:
List<int> bar = new ArrayList<int>();
In java generics are implemented by using "Type erasure" for backward compatibility. All generic types are converted to Object at runtime. for example,
will be seen at runtime as,
compiler is responsible to provide proper cast to ensure type safety.
will become
Now the question is why "Object" is chose as type at runtime?
FYI : Project Valhalla is trying to address above issue.
Generics in Java are an entirely compile-time construct - the compiler turns all generic uses into casts to the right type. This is to maintain backwards compatibility with previous JVM runtimes.
This:
gets turned into (roughly):
So, anything that is used as generics has to be convertable to Object (in this example
get(0)
returns anObject
), and the primitive types aren't. So they can't be used in generics.The collections are defined to require a type which derives from
java.lang.Object
. The basetypes simply don't do that.In Java, generics work the way that they do ... at least in part ... because they were added to the language a number of years after the language was designed1. The language designers were constrained in their options for generics by having to come up with a design that was backwards compatible with the existing language and the Java class library.
Other programming languages (e.g. C++, C#, Ada) do allow primitive types to be used as parameter types for generics. But the flip side of doing this is that such languages' implementations of generics (or template types) typically entail generation of a distinct copy of the generic type for each type parameterization.
1 - The reason generics were not included in Java 1.0 was because of time pressure. They felt that they had to get the Java language released quickly to fill the new market opportunity presented by web browsers. James Gosling has stated that he would have liked to include generics if they had had the time. What the Java language would have looked like if this had happened is anyone's guess.
As per Java Documentation, generic type variables can only be instantiated with reference types, not primitive types.
This is supposed to come in Java 10 under Project Valhalla.
In Brian Goetz paper on State of the Specialization
There is an excellent explanation about the reason for which generic were not supported for primitive. And, how it will be implemented in future releases of Java.
...