2013-04-08 19 views

risposta

29

Questo dichiara il metodo readObjectData generico, con un parametro di tipo, T.

public <T> ... 

Quindi il tipo di reso è T.

... T readObjectData(... 

Senza l'iniziale <T>, che è la dichiarazione di tipo generico, il simbolo T sarà indefinito.

Nell'elenco parametri, Class<T> type è uno dei parametri. Poiché il tipo restituito e questo parametro sono entrambi di riferimento T, questo garantisce che se si passa in un Class<String>, verrà restituito un String. Se passi un Class<Double>, restituirà un Double.

Per passare il parametro, passare qualsiasi oggetto Class, ad es. String.class.

20

La parte <T> sta dichiarando un argomento di tipo generico T. Se dovessi omettere questa parte, il compilatore probabilmente si lamenterebbe che il tipo T non esiste.

In questo caso, T funge da segnaposto per un tipo effettivo, che verrà determinato solo quando il metodo viene effettivamente chiamato con argomenti di tipo non generico.

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

<T> è una classe di parametri. Non esiste una classe denominata T. È possibile utilizzare questo metodo con qualsiasi classe specificata tramite il secondo argomento del metodo denominato type.

dal metodo viene definito come segue:

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

Si può chiamare come scritto qui sotto:

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

Si prega di prestare attenzione che non c'è bisogno di lanciare valore di ritorno di readOjectData() a MyClass.Un tempo, prima di Java 5 questo metodo verrà definito come:

public Object readObjectData(ByteBuffer)

e il suo utilizzo assomigliava:

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

Da colata può causare ClassCastException questa è una cattiva pratica. Questa era una ragione per l'invenzione dei generici.

0

Siete probabilmente confusi da una dichiarazione simile e più comune:

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

Nel caso di cui sopra, non v'è alcuna necessità di "<T>" dopo privato (private <T> T myMethod(T a))

perché il T che sta utilizzando è lo stesso rispetto a quello definito nella classe MyClass<T>

ancora di più, se si scrive

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

allora il significato è che il tipo di ritorno myMethod è (potenzialmente) diverso dal tipo MyClass. Come se hai scritto questo, invece:

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

Credits: Ha preso l'esempio da "Kanagavelu Sugumar" 's risposta più tempo per How to use Class<T> in Java?

Problemi correlati