Why is passing a subclass to a bounded wildcard only allowed in certain places?
以下是来自Generics教程的:
假设R类扩展S,
1 2 3 | public void addR(List<? extends S> s) { s.add(0, new R()); // Compile-time error! } |
您应该能够理解为什么不允许使用上面的代码。s.add()的第二个参数的类型是?扩展s——s的未知子类型。因为我们不知道它是什么类型,所以我们不知道它是否是r的超类型;它可能是或可能不是这样的超类型,所以在那里传递r是不安全的。
我已经读了几遍了,但我还是不太明白为什么下面是一个错误
给出list.add()的签名
1 | void add(int index, E element) |
号
它不等于
1 | void add(int index, <? extends S> element) // just to explain the idea, not a valid syntax |
为什么它是一个错误调用add(0,new r())r是一个s?
以下是斜体文本所指的内容:
为了给出一个更具体的例子,即使
实际上,您不能实际调用声明为
1 2 3 4 | public S getElement(List<? extends S> s) { S result = s.get(0); return result; } |
这个一般概念被称为PECS(生产者扩展,消费者超级)。有效Java的第5章(方便地说,它是你可以从书的网站下载的示例性章节)有更多的关于这个和其他微妙的泛型的说法。
我想这是最简单的解释
类结构:
1 2 3 4 | public class List<? extends S> {} public class S {} public class R extends S {} public class T extends R {} |
号
代码用法:
1 | List<T> list = new List<T>(); |
在这种情况下,以下内容无效:
1 | list.add(new R()); |
。