2014-12-13 78 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

相關問題