通配符(2)

class Fruit{}
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>();
   }
}

你可能感兴趣的:(java,通配符,向上转型)