日期:2014-05-20  浏览次数:20750 次

范型<? extends A> 到底表示什么意思?
看了好久,还是不明白。下面程序的第19行的错误是为什么?
还有,list1与list4,list2与list3有没有区别?
这种表示在实际中应用得多不多,高手们告一声,就用不多的话我就放弃这部分了,搞了两天了。

import java.util.*;

class A {}
class B extends A {}

class C {}

public class Test {
public static void main(String[] args) {
List<A> list1 = new ArrayList<A>();
list1 = Arrays.asList(new A(), new B(), new B(), new A());
// list1 = Arrays.asList(new A(), new B(), new B(), new A(), new C()); //错误
List<A> list2;
List<? extends A> list3;
list2 = Arrays.asList(new A(), new B(), new B(), new A());
list3 = Arrays.asList(new A(), new B(), new B(), new A());
// list2 = Arrays.asList(new A(), new B(), new B(), new A(), new C()); //错误
List<? extends A> list4 = new ArrayList<A>();
List<? extends A> list5 = new ArrayList<? extends A>(); //第19行 错误
}
}
/*
Test.java:19: 意外的类型
找到: ? extends A
需要: 不带限制范围的类或接口
  List<? extends A> list5 = new ArrayList<? extends A>();
  ^  
*/

------解决方案--------------------
list1与list4,list2与list3的区别 我只是知道下面这样:

List<A> list1 = new ArrayList<B>(); //这行不行
List<? extends A> list2 = new ArrayList<B>();

因为B是A的子类 正好符合List<? extends A>中? extends A的意思 所以就能引用。。。

仅供参考哈
------解决方案--------------------
探讨

List<? extends A> list2 = new ArrayList<B>(); 是对的。
List<? extends A> = new ArrayList<? extends A>()有问题, 为何尖特号内的不能保持一致?
下面的可以成功:
List<? extends A> list4 = new ArrayList<B>();
list4 = Arrays.asList……

------解决方案--------------------
List<? extends A> = new ArrayList<? extends A>();这是实体化一个对像但你又给了一个模糊的类型那就没办法实体化,? extends A 指的是所有A的子类而该文字本身不代表一个类


关键是红字估计你换个和A没关系的就不行
List<? extends A> list4 = new ArrayList<B>();
list4 = Arrays.asList(new A(), new B(), new B(), new A());