Here is my program. I am not sure why I am getting a compile time error.
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List< ? extends Number > list = new ArrayList<Integer>();
list.add(6); // Compile Time Error
System.out.println(list);
}
}
But the following program works fine
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List< ? super Number > list = new ArrayList<Number>();
list.add(6);
System.out.println(list);
}
}
Error from Eclipse:
Here is the error description from Eclipse:
The method add(int, capture#1-of ? extends Number) in the type List is not
applicable for the arguments (int)
It’s because what you are doing in the first case isn’t type safe. You have declared
listas aListof “some subclass ofNumber“, and then tried to insert anIntegerinto it. There is absolutely no guarantee thatIntegeris compatible with the actual run-time type of the underlying list. The compiler stops you here because what you are doing doesn’t make any sense.Consider, as an extreme example:
If this were to work, you would have a
List<Integer>with aStringin it!If you really want it to work, you have to tell the compiler you know what you are doing by casting:
But even then you will still get a warning about type safety.
The second case works because the list is guaranteed to be “some superclass of Number”.
Integeris a subclass ofNumber, so it can be implicitly converted to any superclass (includingNumberitself), so there is no risk that the value is incompatible with the actual type of the list.For further information, you may want to read up on the difference between covariance and contravariance.