【发布时间】:2012-10-23 04:02:03
【问题描述】:
我想在这里获取 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>
编辑:我得到了很多答案,说只列出List<Outer<Inner>> 类型的列表,但这是不正确的。如果我这样做,我将不能够添加 Inner 的子类型。如果我尝试添加Outer<Inner2>,它将失败。所以列表的类型必须是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
}
【问题讨论】:
-
请注意,
List<Outer<? extends Inner>>应该用作可以处理List<Outer<Inner>>或List<Outer<ClassThatImplementsInner>>的参数的类型,而不是用于属性声明。
标签: java generics compiler-errors