2011-11-24 63 views
1

我有這個問題。構造函數不應該和類有相同的類型參數嗎?不能從java.lang.Class <T>轉換爲java.lang.Class <T>

public class MyBuilder<T> { 

private final Class<T> clss; 

/** 
* 
* @param clss 
*/ 
public <T> MyBuilder(final Class<T> clss) { 
    this.clss = (Class<T>) clss; // compiler error here 
} 


Type mismatch: cannot convert from java.lang.Class<T> to java.lang.Class<T> 

如果我刪除<T>它編譯構造函數,但我不能這樣做:

MyBuilder<Foo> myBuilder = new MyBuilder<Foo>(); // compiler error here 

的錯誤是構造MyBuilder<Foo>()是不確定的。

+4

爲什麼構造函數簽名中的? –

+0

@HunterMcMillen 在構造函數簽名中是有效的。如何定義ArrayList ? – fastcodejava

+0

因爲這個「T」不是那個「T」。 T只是某種類型的「佔位符」。私人決賽中的T類 clss;與構造函數參數中的T無關。 –

回答

8

從構造爲鑄造卸下類型參數,以及:

public MyBuilder(final Class<T> clss) { 
    this.clss = clss; 
} 

一個類的類型參數,T在這種情況下,隱式聲明任何實例成員,包括構造。通過爲構造函數明確聲明T,您實際上掩蓋了由類聲明的T,從而導致該混淆錯誤。

+0

如果我這樣做,我會得到其他錯誤。 – fastcodejava

+1

對,你不能使用默認構造函數實例化,因爲你沒有定義一個設置最終字段)。無論如何,這個類也是抽象的。 –

5

因爲這個「T」不是「T」。 T只是某種類型的「佔位符」。在

private final Class<T> clss; 

與構造函數參數中的T無關。

相關問題