Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generics Declaration differences in Java

Tags:

java

generics

 List<String> v = new ArrayList<String>();

I understand the generics helps you declare that the ArrayList() has Objects of type String. My question is how is the following one different from the above?

 List<String> v = new ArrayList();

or the one below different from others

List v = new ArrayList<String>();
like image 298
Sherin Syriac Avatar asked May 18 '26 11:05

Sherin Syriac


1 Answers

List<String> v = new ArrayList();

This one isn't really functionally different. The type parameter on the right side doesn't really do anything. It's used as a matter of style and to avoid the use of a Raw type, which is considered a programming error. In fact, in Java 7 it has been enhanced so you can just do this: List<String> v = new ArrayList<>(); and not have to repeat yourself on the right hand side.

List v = new ArrayList<String>();

The list with no type parameter is called a Raw Type. It is generally considered a programming error to declare a Raw Type in new code that is using generics. Basically there is no type checking going on at all when you declare it this way, you can put anything in that list.

Java generics are a compile time check. So it is the type of the reference at compile time that matters. If your reference is of type Raw List it doesn't matter what you declared on the right hand side, that is what the compiler will check against.

List<String> isn't really a "List that has Strings." It is a "List that I have asked the compiler to return errors and/or warn me if I put something in there that isn't a String. If you ignore compiler warnings, it is perfectly possible to get stuff in there that isn't a String.

like image 87
Affe Avatar answered May 20 '26 01:05

Affe



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!