此代码:
public class Base<E> {
static void main(String[] args) {
Base<? extends Base> compound = new Base<Base>();
compound.method(new Base());
} // ^ error
void method(E e) { }
}
给出了这样的编译错误:
Error:(4, 17) java: method method in class Base<E> cannot be applied to given types;
required: capture#1 of ? extends Base
found: Base
reason: actual argument Base cannot be converted to capture#1 of ? extends Base by method invocation conversion
根据我的理解,E
变为? extends Base
,延伸Base
。那么,为什么new Base()
无法通过呢?
答案 0 :(得分:7)
Base<? extends Base> compound
表示compound
参数化为Base
的某个子类型,但您不知道哪一个。{1}}。如果参数类型未知,则编译器无法检查new Base()
是否与该类型匹配。
E
确实变为? extends Base
您可能认为该方法会接受 Base
的任何子类型,但它不会。它只接受Base
的特定但未知的子类型。
因此,您无法调用任何以E
作为参数的方法,但您可以调用返回E
的方法。
允许您的示例编译会导致类型安全错误,如:
List<? extends Object> list = new ArrayList<String>();
list.add(new Object()); // Error - Can't add object to list of Strings.
答案 1 :(得分:0)
尝试以下方法将您的方法定义为通用:
<E> void method(E e) { }
请注意添加<E>
。
这为我修复了编译错误。虽然,我希望您在课堂级别提供的参数已经应用。