为什么新的Base()无法传递给<! - ?扩展Base - >?

时间:2014-12-13 14:18:20

标签: java generics

此代码:

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()无法通过呢?

2 个答案:

答案 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>

这为我修复了编译错误。虽然,我希望您在课堂级别提供的参数已经应用。