2016-04-03 125 views
1

運行Demo類將調用在SomeClass的一個靜態方法的newInstance到調用構造和打印你好(泛型)不能使靜態參考非靜態類型T

限定的方法將包括一個返回類型+帶參數

爲的newInstance返回類型爲<方法名T> SomeClass的< T>似乎不可思議我 因爲我的類被稱爲>的SomeClass的< t鍵< T> SomeClass的< T>

爲什麼我需要在SomeClass < T>前面的< T>? 看來,如果我不包括它會有所謂不能使靜態參考非靜態類型T

另一件事指出一個常見的錯誤 的是,我可以把之間有很多的空間< T>和SomeClass < T>因此它看起來不像他們需要在一起。

public class SomeClass<T> { 

    public static <T>SomeClass<T> newInstance(Class<T> clazz){ 
     return new SomeClass<T>(clazz); 
    } 

    private SomeClass(Class<T> clazz){ 
     System.out.println("hello"); 
    } 
} 

public class Demo { 

    public static void main(String args[]) 
    { 
     SomeClass<String> instance = SomeClass.newInstance(String.class); 
    } 
} 
+0

根據帶問號的唯一句子標記爲重複。 –

+0

http://stackoverflow.com/questions/12108118/what-do-the-angle-brackets-mean-in-this-interface-definition –

回答

4

什麼是靜態方法?一種適用於該類的方法,而不是一個特定的實例。類簽名public class SomeClass<T>中的通用參數T僅適用於特定實例(因此爲non-static type T)。例如SomeClass<String>其中的[T = String]

在方法簽名public static <T>SomeClass<T> newInstance(Class<T> clazz)中包含<T>。你是這麼說的;對於此方法,有一個通用類型參數T。這個T與類簽名中的T分開。所以它可能是C,即public static <C> SomeClass<C> newInstance(Class<C> clazz)。或者完全不同的東西。

但是,如果您沒有在方法中包含<T>,編譯器會認爲您正嘗試在類簽名中使用T。這是違法的。

相關問題