2010-12-10 8 views
117

Ce qui suit est un extrait sur la façon de créer une classe générique java pour ajouter un seul élément à un tableau. Comment puis-je faire de appendToArray une méthode statique. L'ajout de statique à la signature de la méthode entraîne des erreurs de compilation.Comment rendre statique une méthode Java Generic?

public class ArrayUtils<E> { 

     public E[] appendToArray(E[] array, E item) { 
      E[] result = (E[])new Object[array.length+1]; 
      result[array.length] = item; 
      return result; 
     } 
} 
+0

Quelles erreurs de compilation obtenez-vous? Aussi, pourquoi ne pas simplement utiliser l'un des conteneurs de la bibliothèque standard? –

+1

Erreur de compilation: J'ajoutais en fait le modificateur statique incorrect. Utilisation de collections: Oui, l'utilisation d'une collection serait idéale mais la question ne concerne pas les collections par rapport aux collections, mon cas nécessite un tableau. –

+0

Notez que vous devrez utiliser la réflexion (EVIL) pour empêcher le code client de déclencher une exception dans certains cas, mais pas dans tous les cas (agréable). Il est préférable d'éviter les tableaux de référence. –

Répondre

210

la seule chose que vous pouvez faire est de changer votre signature

public static <E> E[] appendToArray(E[] array, E item) 

détails importants:

expressions génériques précédant la valeur de retour introduire toujours (déclarer) un nouveau type générique variable.

En outre, les variables de type entre les types (ArrayUtils) et les méthodes statiques (appendToArray) n'interfèrent jamais les unes avec les autres.

Alors, qu'est-ce que cela veut dire: Dans ma réponse <E> cachions la E de ArrayUtils<E> si la méthode ne serait pas static. ET <E> n'a rien à voir avec le E de ArrayUtils<E>.

Pour refléter ce fait mieux, une réponse plus correcte serait:

public static <I> I[] appendToArray(I[] array, I item) 
+16

Veuillez également noter qu'il n'y a absolument aucune relation entre la variable de type "E" et la variable statique "E". Je considère qu'il est préférable d'utiliser un nom de variable différent lors de la déclaration de méthodes génériques, statiques ou non, dans des classes génériques. –

+0

mais dans ce cas, je peux passer un objet de différents types dans les paramètres. Comme je peux passer tableau Integer [] comme premier paramètre et élément double. – pinkpanther

+0

pinkpanther: C'est vrai, mais ça ne fait pas de mal, car la méthode statique ne fonctionne que sur un objet tableau qui lui est passé via un paramètre, donc ses éléments sont sûrs d'avoir le bon type. – Dabbler

7

Vous devez déplacer le paramètre de type au niveau de la méthode pour indiquer que vous avez une méthode générique plutôt que classe générique:

public class ArrayUtils { 
    public static <T> E[] appendToArray(E[] array, E item) { 
     E[] result = (E[])new Object[array.length+1]; 
     result[array.length] = item; 
     return result; 
    } 
} 
57
public static <E> E[] appendToArray(E[] array, E item) { ... 

Notez le <E>.

Les méthodes génériques statiques nécessitent leur propre déclaration générique (public static <E>) distincte de la déclaration générique de la classe (public class ArrayUtils<E>). Si le compilateur se plaint d'une ambiguïté de type en invoquant une méthode générique statique (encore une fois dans notre cas, mais en général au cas où), voici comment appeler explicitement une méthode générique statique en utilisant un type spécifique (_class_.<_generictypeparams_>_methodname_):

String[] newStrings = ArrayUtils.<String>appendToArray(strings, "another string"); 

Cela ne se produirait si le compilateur ne peut pas déterminer le type générique parce que, par exemple, le type générique n'est pas lié aux arguments de la méthode.

Questions connexes