Comment interpréter “public <T> T readObjectData(... Classe<T> 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 public <T> T
au lieu de public T
?
Comment donner le paramètre pour le 2ème argument (Class<T> type
)?
Vous devez vous connecter pour publier un commentaire.
Il déclare l'
readObjectData
méthode générique, avec un paramètre de type,T
.Puis le type de retour est
T
.Sans
<T>
, qui est le générique de la déclaration de type, le symboleT
ne sera pas défini.Dans la liste des paramètres,
Class<T> type
est l'un des paramètres. Parce que le type de retour et de ce paramètre à la fois de référenceT
, ce qui assure que si vous passez unClass<String>
, puis il sera de retour uneString
. Si vous passez dans unClass<Double>
, puis il sera de retour uneDouble
.De passer dans le paramètre, passer dans tous les
Class
objet, par exempleString.class
.La
<T>
partie est de déclarer une argument de type génériqueT
. Si vous omettez cette partie, le compilateur aurait vraisemblablement se plaignent que le typeT
n'existe pas.Dans ce cas,
T
sert d'espace réservé pour un type réel, qui ne sera déterminé lorsque la méthode est en fait appelé à la non-générique type d'arguments.<T>
est un paramètre de la classe. Il n'y a pas de classe nomméeT
. Vous pouvez utiliser cette méthode avec toute la classe spécifiée par le deuxième argument d'une méthode nomméetype
.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'avez pas à jeter valeur de retour de
readOjectData()
àMyClass
. Une fois, avant java 5 cette méthode pourrait être définie comme:public Object readObjectData(ByteBuffer)
et son utilisation ressemblait:
MyClass obj = (MyClass)o.readObjectData(buffer);
Depuis la coulée peut provoquer
ClassCastException
c'est une mauvaise pratique. C'était une raison pour l'invention de médicaments génériques.Vous êtes probablement confondu par un similaire et plus déclaration commune:
Dans le cas ci-dessus, il n'est pas nécessaire pour
"<T>"
privées (private <T> T myMethod(T a)
)parce que le
T
d'utilisation est le même que celui défini dans la classeMyClass<T>
Même plus, si vous écrivez
alors le sens est que l'myMethod type de retour est (potentiellement) différent du type Maclasse. Que si vous avez écrit ceci à la place:
Crédits: il a Pris l'exemple de "Kanagavelu Sugumar"'s plus de répondre à Comment utiliser la Classe<T> en Java?