源码是这样的:
import java.util.*;
class Fluit{}
class Apple extends Fluit{}
public class Generics {
public static void main(String[] args){
@SuppressWarnings("unused")
List<? extends Fluit> flist=new ArrayList<Apple>();
flist.add(new Apple());
}
}
然后 flist.add()方法内不可加任何的对象 包托Object 仅能添加null 请大神解释其原理 ~!泛型通配符
import java.util.*;
class Fluit{}
class Apple extends Fluit{}
public class Generics {
public static void main(String[] args){
@SuppressWarnings("unused")
List<? extends Fluit> flist=new ArrayList<Apple>();
flist.add(new Apple());
}
}
然后 flist.add()方法内不可加任何的对象 包托Object 仅能添加null 请大神解释其原理 ~!泛型通配符
如上面所说,List<? extends Fluit>规定了list中添加的对象需要满足的一个条件,即必须是Fluit子类的实例,而new ArrayList<Apple>()这里就具体的实例化了一个ArrayList对象,并且指定了具体的子类类型Apple,应为Apple是Fluit的一个子类,所以就可以想list中添加
在对象中 Fluit fluit = new Apple(); 这样子是莫有错的,对象的多态性么。
但是 在泛型中这样子是绝对不可以的, ,引用书本上的例子: List<Fluit> 和 ArrayList<Apple> 分别代表 水果和苹果,假如你去买水果,肯定是只买各种水果中的一部份,List<? extends Fluit> flist=new ArrayList<Apple>(); 就相当于购买了全部的水果,这个违背常识么
还有,泛型的作用就是检查数据类型,,,,和new()什么的 没一毛钱关系哦
List<? extends Fluit> 表示任何从Fluit导出的类, 然后 ArrayList<Apple>这个泛型在实际的运行时 Apple的所有类型信息会被擦除掉 JVM不确定这个类 也就无从得知其是否从Fluit中导出了. 所以flist无法添加任何非null的对象