class B extends A {}
class C extends A {}
class D extends B {}
下面的哪4个语句是正确的?
The type List<A>is assignable to List.
The type List<B>is assignable to List<A>.
The type List<Object>is assignable to List<?>.
The type List<D>is assignable to List<?extends B>.
The type List<?extends A>is assignable to List<A>.
The type List<Object>is assignable to any List reference.
The type List<?extends B>is assignable to List<?extends A>.
public static void main(String[] args) { List<A> a; List list; list = a; //A对,因为List就是List<?>,代表最大的范围,A只是其中的一个点,肯定被包含在内 List<B> b; a = b; //B错,点之间不能相互赋值 List<?> qm; List<Object> o; qm = o; //C对,List<?>代表最大的范围,List<Object>只是一个点,肯定被包含在内 List<D> d; List<? extends B> downB; downB = d; //D对,List<? extends B>代表小于等于B的范围,List<D>是一个点,在其中 List<?extends A> downA; a = downA; //E错,范围不能赋值给点 a = o; //F错,List<Object>只是一个点 downA = downB; //G对,小于等于A的范围包含小于等于B的范围,因为B本来就比A小,B时A的子类嘛 }
public class TestDemo { public void test() { List list = new ArrayList(); List<A> listA = new ArrayList<>(); list = listA; // A对 List<B> listB = new ArrayList<>(); // listA = listB; // B错误 List<Object> listObject = new ArrayList<>(); List<?> list$ = new ArrayList<>(); list$ = listObject; // C对 List<D> listD = new ArrayList<>(); List<? extends B> listExtendsB = new ArrayList<>(); listExtendsB = listD; // D对 List<? extends A> listExtendsA = new ArrayList<>(); // listA = listExtendsA; // E错误 // F明显错误 listExtendsA = listExtendsB; // G对 } class A { } class B extends A { } class C extends A { } class D extends B { } }
类型通配符一般是使用 ? 代替具体的类型实参。注意了,此处是类型实参,而不是类型形参!且Box<?>在逻辑上是Box<Integer>、Box<Number >...等所有Box<具体类型实参>的父类。由此,我们依然可以定义泛型方法,来完成此类需求。
publicstaticvoidmain(String[] args) {List<A> a;List list;list = a; //A对,因为List就是List<?>,代表最大的范围,A只是其中的一个点,肯定被包含在内List<B> b;a = b; //B错,点之间不能相互赋值List<?> qm;List<Object> o;qm = o; //C对,List<?>代表最大的范围,List<Object>只是一个点,肯定被包含在内List<D> d;List<?extendsB> downB;downB = d; //D对,List<? extends B>代表小于等于B的范围,List<D>是一个点,在其中List<?extendsA> downA;a = downA; //E错,范围不能赋值给点a = o; //F错,List<Object>只是一个点downA = downB; //G对,小于等于A的范围包含小于等于B的范围,因为B本来就比A小,B时A的子类嘛}
// Illegal code - because otherwise life would be Bad List<Dog> dogs = new ArrayList<Dog>(); // ArrayList implements List List<Animal> animals = dogs; // Awooga awooga animals.add(new Cat()); Dog dog = dogs.get(0); // This should be safe, right?