我想在这里获取 G.myUglyList 列表的内容并将其传递给 Outer.send() 方法。我不明白为什么这会产生编译器错误。? extends Inner 是我参数化 Outer 的类型。那么为什么它拒绝传递给它的 Inner 呢?它想要一个“? extends Inner”,它不是一种类型。
我希望将列表声明为List<Outer<? extends Inner>>
它可以采用 Inner 的子类型。(请参阅下面的编辑了解为什么会这样)
interface Outer<T> {
void send(T message);
}
interface Inner {}
interface Inner2 extends Inner {}
public class G {
List<Outer<? extends Inner>> myUglyList;
void foo() {
Inner xxx = null;
for (Outer<? extends Inner> outer : myUglyList) {
outer.send(xxx); //error
}
}
}
我收到此错误:
error: method send in interface Outer<T#2> cannot be applied to given types;
required: CAP#1
found: Inner<T#1>
reason: actual argument Inner<T#1> cannot be converted to CAP#1 by method invocation conversion
where T#1,T#2 are type-variables:
T#1 extends Object declared in class G
T#2 extends Object declared in interface Outer
where CAP#1 is a fresh type-variable:
CAP#1 extends Inner<T#1> from capture of ? extends Inner<T#1>
编辑:我得到了很多答案,说只是列出 type List<Outer<Inner>>
,但这是不正确的。如果这样做,我将无法添加 Inner 的子类型。如果我尝试添加一个Outer<Inner2>
,它会失败。所以 list 必须是 type List<Outer<? extends Inner>>
。
interface Inner2 extends Inner {}
class G {
void foo() {
Outer<Inner2> foiled = null;
myUglyList.add(foiled); //this will fail if list is of type List<Outer<Inner>>
Inner xxx = null;
for (Outer<? extends Inner> outer : myUglyList) {
outer.send(xxx); //error
}