Search code examples
javagenericsraw-types

Java Generics and Raw Types


I have the next code:

ArrayList value = new ArrayList<Integer>();  // 1
value.add("Test");  // 2

I'm trying to understand line 2. Although I can see that value.add("Test"); compiles without errors, I can't see the reason it doesn't throw a runtime exception. If value is referencing a generic ArrayList object, why Java allows to add a String to it? Can anyone explain it to me?

The closest explanation I've found about this is described here, but I still don't understand the core reason:

Stack s = new Stack<Integer>()

This is a legal conversion from a parameterized type to a raw type. You will be able to push value of any type. However, any such operation will result in an "unchecked call" warning.


Solution

  • Generic types are erased during compilation. So at runtime, an ArrayList is a raw ArrayList, no matter if you defined it as generic or not.

    In your case, the code compiles as your ArrayList declaration is not generic, and it runs fine because of type erasure.