Why first three lines didn't compile and the remaining 2 did? How exactly does this work?
import java.util.*;
class HelloWorld {
public static void main(String[] args) {
//List<Number> ints = new ArrayList<Integer>(); DIDN'T compile
//List<Integer> nums = new ArrayList<Number>(); DIDN'T compile
//List<Object>nums = new ArrayList<Integer>(); DIDN'T compile
//List<? extends Number> nums = new ArrayList<Integer>(); compiled
//List<? super Number> nums = new ArrayList<Object>(); compiled
}
}`
First 3 line was not compiled because in Java, generic types are not satisfied or covariant fro ensuring type safety which means that List<Intreger>
is not count a sub type of List<Number>
. lets describe line of given code
Don't Compile Line :
List<Number> ints = new ArrayList<Integer>();
: We can not assign a List<Integer>
to a variable type of List<Number>
because generics in java are not covariant.List<Integer> nums = new ArrayList<Number>();
: Same reason as first one ,we can't assign List<Number>
to a variable type of List<Integer>
List<Object>nums = new ArrayList<Integer>();
: Same reason as first one ,we can't assign List<Integer>
to a variable type of List<Object>
Compiled Line :
List<? extends Number> nums = new ArrayList(); : This line work because in this line you use a wildcard with a upper bound ? extends Number
. Upper bound wildcard allows you to accept any subtype of type T
. That mean ? extends Number
this accept Integer
, Double
, Float
etc.
List<? super Number> nums = new ArrayList(); :
List<? extends Number> nums = new ArrayList(); : This line work because in this line you use a wildcard with a lower bound ? extends Number
.Lower bound wildcard allows you to accept any super type of type T
.
That mean ? extends Number
this accept Number
and Object
.