扩展和超级的通用概念

时间:2013-06-05 13:57:25

标签: java list generics

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,但我无法理解这意味着什么。请给我一个详细的解释,并举例说明这一点。

2 个答案:

答案 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