0

Generic 扩展背后的概念是什么,为什么不允许修改列表;为什么当我将字符串添加到 list 时会引发编译时错误,因为 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,但无法理解这意味着什么。请给我一个详细的解释和例子来理解这一点。

4

2 回答 2

2

您不能将字符串添加到 aList<? extends Object>因为 ? 可以是任何东西。

如果你想把东西放到一个列表中,它的类型参数应该是你要放入的类型的超类。(这包括类型本身。)

如果你想一个列表中获取东西,它的类型参数应该是你想取出的类型的子类。(这包括类型本身。)

这可以用首字母缩写词 PECS - producer-extends,consumer-super 来记住。

于 2013-06-05T14:00:16.220 回答
0

编译器不在乎尝试分析列表的实际泛型类型是什么,它只检查ls声明的泛型类型。和这里一样

void add(List<? extends Object> ls) {
   ls.add("1");
   ...

ls例如可以是整数列表,您不能在其中添加“1”。

类似的解释适用于super

于 2013-06-05T14:18:18.303 回答