Comment interpréter " public T readObjectData (type Class type)" en Java?
J'ai ce code Java.
public <T> T readObjectData(ByteBuffer buffer, Class<T> type) {
...
T retVal = (T) summaries;
return retVal;
Comment interpréter ce code? Pourquoi avons-nous besoin de public <T> T
au lieu de public T
?
Comment donner le paramètre au 2ème argument (Class<T> type
)?
4 answers
Cela déclare la méthode readObjectData
générique, avec un paramètre de type, T
.
public <T> ...
Alors le type de retour est T
.
... T readObjectData(...
Sans l'initiale <T>
, qui est la déclaration de type générique, le symbole T
sera indéfini.
Dans la liste des paramètres, Class<T> type
est l'un des paramètres. Comme le type de retour et ce paramètre font tous deux référence à T
, cela garantit que si vous passez un Class<String>
, il retournera un String
. Si vous passez dans un Class<Double>
, alors il retourne un Double
.
Pour passer dans le paramètre, passez dans n'importe quel objet Class
, par exemple String.class
.
La partie <T>
déclare un argument de type générique T
. Si vous omettiez cette partie, le compilateur se plaindrait probablement que le type T
n'existe pas.
Dans ce cas, T
sert d'espace réservé pour un type réel, qui ne sera déterminé que lorsque la méthode est réellement appelée avec des arguments de type non génériques.
public <T> T readObjectData(...
^ ^
| + Return type
+ Generic type argument
<T>
est une classe de paramètres. Il n'y a pas de classe nommée T
. Vous pouvez utiliser cette méthode avec n'importe quelle classe spécifiée via un deuxième argument de méthode nommé type
.
, Puisque la méthode est définie comme suit:
public <T> T readObjectData(ByteBuffer buffer, Class<T> type)
, Vous pouvez l'appeler comme écrit ci-dessous:
MyClass obj = o.readObjectData(buffer, MyClass.class);
Veuillez faire attention à ce que vous n'ayez pas à convertir la valeur de retour de readOjectData()
en MyClass
. Une fois, avant java 5 cette méthode pourrait être définie comme:
public Object readObjectData(ByteBuffer)
Et son utilisation on dirait:
MyClass obj = (MyClass)o.readObjectData(buffer);
Puisque le casting peut causer ClassCastException
c'est une mauvaise pratique. C'était une raison pour l'invention des génériques.
Vous êtes probablement confus par une déclaration similaire et plus commune:
class MyClass<T> {
private T myMethod(T a){
return a;
}
}
Dans le cas ci-dessus, il n'y a pas besoin de "<T>"
après privé ( private <T> T myMethod(T a)
)
, Car la T
, il utilise est le même que celui défini dans la classe MyClass<T>
Encore plus, si vous écrivez
class MyClass<T> {
private <T> T myMethod(T a){
return a;
}
}
Alors la signification est que le type de retour myMethod est (potentiellement) différent du type MyClass. Comme si vous aviez écrit ceci à la place:
class MyClass<T1> {
private <T2> T2 myMethod(T2 a){
return a;
}
}
Crédits: A pris l'exemple de " Kanagavelu La réponse plus longue de Sugumar à Comment utiliser Class