2013-04-08 61 views

回答

29

這聲明readObjectData方法通用,具有一個類型參數T

public <T> ... 

然後返回類型是T

... T readObjectData(... 

沒有初始<T>,這是通用類型聲明,符號T將是不確定的。

在參數列表中,Class<T> type是其中一個參數。由於返回類型和此參數都參考T,這可確保如果您通過Class<String>,那麼它將返回String。如果您通過Class<Double>,那麼它將返回Double

要傳入參數,請傳遞任何Class對象,例如, String.class

20

<T>部分聲明泛型類型參數T。如果您要省略此部分,編譯器可能會抱怨T類型不存在。

在這種情況下,T充當實際類型的佔位符,僅在實際使用非泛型類型參數調用方法時纔會確定。

public <T> T readObjectData(... 
     ^^ 
     | + Return type 
     + Generic type argument 
12

<T>是一個參數類。沒有名字叫T。您可以將此方法與通過名爲type的第二個方法參數指定的任何類一起使用。

因爲方法定義如下:

public <T> T readObjectData(ByteBuffer buffer, Class<T> type)

你可以稱它爲如下記載:

MyClass obj = o.readObjectData(buffer, MyClass.class);

請注意,你不必投的返回值readOjectData()MyClass。曾幾何時,JAVA 5之前調用此方法將被定義爲:

public Object readObjectData(ByteBuffer)

及其使用看起來像:

MyClass obj = (MyClass)o.readObjectData(buffer);

由於鑄造可能導致ClassCastException這是一個不好的做法。這是仿製藥發明的原因。

0

你可能通過類似多見聲明困惑:

class MyClass<T> { 
    private T myMethod(T a){ 
     return a; 
    } 
} 

在上述情況下,沒有必要對"<T>"後私(private <T> T myMethod(T a)

,因爲它使用的T是一樣的比類別中定義的要多MyClass<T>

更多的,如果你寫

class MyClass<T> { 
    private <T> T myMethod(T a){ 
     return a; 
    } 
} 

然後,含義是myMethod返回類型(可能)不同於MyClass類型。因爲如果你寫了這個,而不是:

class MyClass<T1> { 
    private <T2> T2 myMethod(T2 a){ 
     return a; 
    } 
} 

現金拿了例如,從「Kanagavelu Sugumar」的長答案How to use Class<T> in Java?