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)?

Author: Paul Bellora, 2013-04-09

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.

 33
Author: rgettman, 2013-04-08 20:42:19

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
 22
Author: cdhowie, 2013-04-08 20:42:21

<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.

 13
Author: AlexR, 2013-04-08 20:47:10

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 en Java?

 2
Author: rafahoro, 2017-05-23 11:54:34