问题
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.
回答1:
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.
回答2:
ArrayList value
this is your type declaration which is not generic. That is why compiler allows you to add any Object to the list.
来源:https://stackoverflow.com/questions/26733112/java-generics-and-raw-types