2014-12-13 76 views
5

此代码:为什么新的Base()不能传递给<?扩展Base>?

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

回答

7

Base<? extends Base> compound意味着compound是用Base的某个子类型进行参数化的,但您不知道是哪一个。如果参数类型未知,则编译器无法检查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. 
0

尝试以下操作来定义你的方法作为通用的:

<E> void method(E e) { } 

注意添加<E>的。

这为我解决了编译错误。尽管如此,我还是希望您在课堂上提供的参数能够应用。

+0

有了''方法之前,任何物体都可以通过:)不过,我的问题不是如何让它编译。我善意地要求解释它为什么不编译:) – 2014-12-13 14:51:23

相关问题