class Fruit{}
class Apple extends Fruit{}
/*
* 不能把一个涉及Apple容器的泛型付给一个涉及Fruit的 泛型
* Apple的List将持有任何类型的Fruit,Apple的 List在类型上不等价于Fruit的List
* 即区分容器的类型和容器持有的类型。*/
public class NonCorvariantGenerics {
// List<Fruit> flist=new ArrayList<Apple>();//编译出错。
class Apple extends Fruit{}
/*
* 不能把一个涉及Apple容器的泛型付给一个涉及Fruit的 泛型
* Apple的List将持有任何类型的Fruit,Apple的 List在类型上不等价于Fruit的List
* 即区分容器的类型和容器持有的类型。*/
public class NonCorvariantGenerics {
// List<Fruit> flist=new ArrayList<Apple>();//编译出错。
}
与数组不同,泛型没有内建的协变类型。这是因为数组在语言中是完全定义的,因此可以内建了编译期和运行期检查,
但是在使用泛型时,编译器运行时系统都不知道你想用类型做些什么,此时在两个类型之间建立某种类型的向上转型关系,
这正是通配符所允许的
public class GenericAndCovariance {
public static void main(String[]args){
List<? extends Fruit> flist=new ArrayList<Apple>();
}
}