Reputation: 4365
If so, what is the difference between the two? Are there actually two separate class definitions in the java library? One for the old ArrayList and one for the new generic one? This is purely a question from curiosity.
Upvotes: 4
Views: 4893
Reputation: 17622
ArrayList<Object> a1 = new ArrayList<Object>();
ArrayList a2 = new ArrayList();
boolean same = a1.getClass().equals(a2.getClass());
System.out.println("same="+same);
This prints "true". Both arrays are in fact objects of the same class.
Upvotes: 1
Reputation: 210755
ArrayList
: Obsolete (unparametrized). Used only for backward-compatibility. Generates warning.
ArrayList<Object>
: An array-based list of objects.
ArrayList<? extends Object>
: An array-based list of some type of Object
.
For example, could be referring to an ArrayList<Integer>
, an ArrayList<String>
, or just a plain ArrayList<Object>
.
Upvotes: 1
Reputation: 262834
There is just one class ArrayList
, but it supports generics, which means that you can annotate it with a type. However, that is optional (mostly for backwards compatibility), so you can also continue to use the raw type (but that is discouraged).
Note that Java generics only happen for the compiler, at runtime the ArrayList instance itself has no idea what generic type you assigned to it. This means that it works exactly the same way internally if you annotate it or not.
Unlike arrays, there are no new separate classes for generic collections. So while there is actually a different class for Integer[]
than for String[]
(or for Integer[][]
), the class for ArrayList<String>
is the same as for ArrayList<Integer>
(and ArrayList<?>
and ArrayList
and ArrayList<List<Integer>>
).
And also unlike arrays, there is nothing special in generics for use by collections (although that remains their most popular application). The same mechanism can be used for completely different things, for example a Callable.
Upvotes: 6
Reputation: 4942
They're the same. Generic type restrictions are enforced at compile-time, but no type information is actually present at runtime. This is called type erasure, and it means that at runtime, it's actually impossible to determine what generic type(s) an instance was declared with. See this Wikipedia page for more info.
Upvotes: 1
Reputation: 133639
They are the same class, actually the difference resides only in the type checker.
ArrayList<T>
is just an annotation for the compiler to enforce that just objects of type T
can be added to the specific list, and consequently it automatically allows you to retrieve objects from the collection that are already of type T
.
This mechanism, that is called parametric polymorphism, has been added to Java since version 5 and it's implemented through type erasure: the compiler will make sure that you use the class just with correct types, as you defined, but at runtime the old ArrayList
will be used.
They're exactly the same class, indeed.
Upvotes: 1
Reputation: 81724
No, they're the same class, in that there's only one class file. Existing API classes were "generified" in such a way that old code could continue to be compiled with no change, and interoperate nicely with new code which used the new features.
Upvotes: 4