Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 764
Bleyder Avatar asked Feb 12 '23 15:02

Bleyder


2 Answers

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.

like image 118
xlecoustillier Avatar answered Feb 16 '23 04:02

xlecoustillier


ArrayList value this is your type declaration which is not generic. That is why compiler allows you to add any Object to the list.

like image 43
Dmytro Avatar answered Feb 16 '23 03:02

Dmytro