web-dev-qa-db-fra.com

Comment rendre une méthode Java générique statique?

Voici un extrait de code expliquant comment créer une classe générique Java afin d'ajouter un seul élément à un tableau. Comment faire pour que appendToArray soit une méthode statique. Ajouter statique à la signature de la méthode entraîne des erreurs de compilation.

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;
        }
}
146
Chris Johnson

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

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

Détails importants:

Les expressions génériques précédant la valeur de retour introduisent toujours (déclarent) une nouvelle variable de type générique.

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

Donc, qu'est-ce que cela signifie: Dans ma réponse, <E> masquerait la E à ArrayUtils<E> si la méthode ne serait pas static. AND <E> n'a rien à voir avec le E de ArrayUtils<E>.

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

public static <I> I[] appendToArray(I[] array, I item)
252
scheffield
public static <E> E[] appendToArray(E[] array, E item) { ...

Notez le <E>.

Les méthodes génériques statiques ont besoin de 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 appelant une méthode générique statique (ce qui est peu probable dans votre cas, mais, en général, juste au cas où), voici comment appeler explicitement une méthode générique statique à l'aide d'un type spécifique (_class_.<_generictypeparams_>_methodname_):

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

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

71
Bert F

Vous devez déplacer le paramètre type au niveau de la méthode pour indiquer que vous avez une méthode générique plutôt qu'une 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;
    }
}
9
axtavt