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.
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.
ArrayList value
this is your type declaration which is not generic. That is why compiler allows you to add any Object to the list.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With