List <? extends Object> list=new ArrayList(); 我的理解是:你写这句就表示java无法确定你的list存放的有可能是?,也有可能是Object,所有无法确定具体的。 你可以换种方式啊,比如写个方法: public void addList(List <? extends Object> list) { list.add(); } 在调用这个方式时的list参数肯定是确定的。
List<? extends Object> list = new ArrayList(); list.add(new Object());/* The method add(capture#1-of ? extends Object) in the type List<capture#1-of ? extends Object> is not applicable for the arguments (Object)这个问题很有意思,当使用add方法添加任意对象比如Object,出现了以上编译错误。"?extends Object"是限制泛型的一种用法,本质上应该这样表示任何Object的子类都可以加入这个List,而使用了泛型的List所有方法比如add都要在编译器检查类型的正确性,之前定义在<>之中的类型就是编译检查参照的标准,可是这里在编译add时编译器发现参照标准类型无法确定下来,任何类都是继承自Object,到底以谁为参照标准呢? */
http://gdluckyzhang.javaeye.com/blog/247938
则表示你传入的是Date对象,你也可以传入其它对象。但是在添加的时候只能添加你传入的对象。
list.add("aa");这样就会报错呀,难到String不是Object的子类
list.add("aa");
里的<? extends Object>不了理解,为什么用了这个后LIST不能ADD了
<? extends Object> 就像接口编程 你从里面读数据是没有关系的,
但是你现在是add list却找到不到自己的类型,因为你继承的是 object类,
你插入的可能是各种类型
我的理解是:你写这句就表示java无法确定你的list存放的有可能是?,也有可能是Object,所有无法确定具体的。
你可以换种方式啊,比如写个方法:
public void addList(List <? extends Object> list)
{
list.add();
}
在调用这个方式时的list参数肯定是确定的。
List<? extends Object> list = new ArrayList();
list.add(new Object());/*
The method add(capture#1-of ? extends Object) in the type List<capture#1-of ? extends Object> is not applicable for the arguments (Object)这个问题很有意思,当使用add方法添加任意对象比如Object,出现了以上编译错误。"?extends Object"是限制泛型的一种用法,本质上应该这样表示任何Object的子类都可以加入这个List,而使用了泛型的List所有方法比如add都要在编译器检查类型的正确性,之前定义在<>之中的类型就是编译检查参照的标准,可是这里在编译add时编译器发现参照标准类型无法确定下来,任何类都是继承自Object,到底以谁为参照标准呢?
*/
List <String> list=new ArrayList<String>();
就只能保存String类型的数据了.
这种通配符只适用于返回参数,即get方法,因为编译器知道它是SuperClass的类型,只要是SuperClass或者父类型的引用都可以接受类型。
与其正好相反的是<? super ChildClass>,这个通配符类型编译器只能调用set方法,不可以调用get方法,即只能传入参数不可返回参数,因为编译器知道?类型一定是ChildClass的子类,所以可以传入任何ChildClass的子类,但是编译器不知道?的最高引用是哪个类型,所以只能用Object引用来接收类型。
想想
编译器确实不知道是什么类型的
因为任何类都Object的子类
这和泛型要求的有点像违背了