请问:
List<? extends Fruit> flist = new ArrayList<Apple>();
flist.add(new Apple());
这为什么报错呢
另外“ArrayList<?> 类型是 ArrayList<T> 的超类型” 这句话是不是说反了
请详细讲讲这个泛型通配符的用法和限制 我看了许多博客 但看的不怎么明白
谢谢
List<? extends Fruit> flist = new ArrayList<Apple>();
flist.add(new Apple());
这为什么报错呢
另外“ArrayList<?> 类型是 ArrayList<T> 的超类型” 这句话是不是说反了
请详细讲讲这个泛型通配符的用法和限制 我看了许多博客 但看的不怎么明白
谢谢
<? extends Fruit>这种用法一般是用于处理多态的时候
比如:
public void show(List<? extends Fruit> fruit){ for(Fruit s :fruit){ //操作 } }
这种情况下是可以的。
但是集合操作情况下不允许这样。
flist.add(new Apple());
这样可以!
通配符的泛型则不可以的!
如2楼,主要用于处理多态应用!
泛型在声明(List <? extends Fruit> flist)和定义(new ArrayList <Apple>())的时候泛型类型必须一致。否则是不能通过编译的。下面这个语句是可以的flist.add(new Apple());,因为在声明 List 是指定了该链表中装的对象是Fruit的子类,所以是可以的。
...
调用add 报错!
flist.add(new Apple());
? extends Fruit> 表示类型是 Fruit的子类。但是这个子类没有明确的界限。java不能确定最低的子类。flist.add 这里的add只能添加 最低的子类的 子类,所以这个根本 没法 做,我也只能这么说明了,说不清啊。
目前这种flist只能添加null。
可以这样定义
List<? super Fruit> flist = new ArrayList<Fruit或者其父类>();
flist.add(new Apple());
就没有问题了。