Generic扩展背后的概念是什么,不允许修改它 列表;为什么在我将字符串添加到列表时会抛出编译时错误,因为String扩展了Object并且应该是合法的。
如果这会产生编译错误,那么创建该列表的用途是什么。
List<? extends Object> ls=new ArrayList<String>();
ls.add("asd"); // compilation error
并且它在super的情况下编译。
List<? super Integer> ls1=new ArrayList<Object>();
ls1.add(1);
我读过Kathy Sierra和Javadoc,但我无法理解这意味着什么。请给我一个详细的解释,并举例说明这一点。
答案 0 :(得分:2)
您无法将字符串添加到List<? extends Object>
,因为?可能是任何事情。
如果要将放入列表中,其类型参数应该是要放入的类型的超类。(这包括类型本身。)
如果你想从列表中获取,它的类型参数应该是你想要取出的类型的子类。 (这包括类型本身。)
这可以用首字母缩略词PECS - producer-extends,consumer-super记住。
答案 1 :(得分:0)
编译器不关心尝试分析实际泛型类型的列表是什么,它只检查ls
声明的泛型类型。它和这里一样
void add(List<? extends Object> ls) {
ls.add("1");
...
ls
可以是例如整数列表,你不能添加“1”。
类似的解释适用于super