2016-06-23 80 views
-2

使用通配符類只會導致警告。但是,什麼是錯用這種方法,我得到編譯器錯誤」 ...不能從類SubclassX轉換爲類將類指定爲泛型屬性

public static <T extends Superclass> void createInstance(Class<T> param) { 
    if (param == null) { 
     if (whatever) { 
      param = Subclass1.class; // Comp-Error 
     } else if (whatever2) { 
      param = Subclass2.class; // Comp-Error 
     } else { 
      // Error 
     } 
    } 

}

編輯: 只是可以肯定,Subclass1和Subclass2正在擴大超類。

+0

當該方法被調用時,「T」應該是「Superclass」的某個特定子類(在編譯時不知道)「。編譯器無法知道「T」將會與「Subclass1」或「Subclass2」兼容。 – khelwood

+0

@khelwood:我添加了一個編輯。你的答案仍然正確嗎?我相信,編譯器知道,'Subclass1繼承了Superclass {}'。 – Sammy

+0

如果編譯器確定'T'是'Subclass1',則只能將'Class '變量賦值給'Subclass1.class'。但它不會,因爲'T'可能是'Superclass'的任何子類。 – khelwood

回答

0

T由編譯器根據方法調用選擇(例如,ContainingClass.createInstance(Subclass2.class)表示T = Class<Subclass1>)。 Subclass1.classClass<Subclass1>)或Subclass2.classClass<Subclass2>)可指定爲Class<T>,這並不是保證。實際上沒有類T這樣兩個都是可分配的。

+0

謝謝,那是我不知道/意識到的內幕。 – Sammy