¿Cómo hacer un método genérico de Java estático?


Lo siguiente es un fragmento de código sobre cómo hacer que una clase genérica de java anexe un solo elemento a una matriz. ¿Cómo puedo hacer appendToArray un método estático. Agregar estática a la firma del método produce errores de compilación.

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;
        }
}
 133
Author: Chris Johnson, 2010-12-10

3 answers

Lo único que puedes hacer es cambiar tu firma a{[12]]}

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

Detalles Importantes:

Las expresiones genéricas que preceden al valor devuelto siempre introducen (declaran) una nueva variable de tipo genérico.

Además, las variables de tipo entre tipos (ArrayUtils) y métodos estáticos (appendToArray) nunca interfieren entre sí.

Entonces, ¿qué significa esto: En mi respuesta <E> ocultaría el E de ArrayUtils<E> si el método no fuera static. Y <E> tiene nada que ver con el E de ArrayUtils<E>.

Para reflejar mejor este hecho, una respuesta más correcta sería: {[12]]}

public static <I> I[] appendToArray(I[] array, I item)
 232
Author: scheffield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-10 20:58:34
public static <E> E[] appendToArray(E[] array, E item) { ...

Note el <E>.

Los métodos genéricos estáticos necesitan su propia declaración genérica (public static <E>) separada de la declaración genérica de la clase (public class ArrayUtils<E>).

Si el compilador se queja de una ambigüedad de tipo al invocar un método genérico estático (de nuevo no es probable en su caso, pero, en términos generales, solo por si acaso), aquí le mostramos cómo invocar explícitamente un método genérico estático usando un tipo específico(_class_.<_generictypeparams_>_methodname_):

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

Esto solo sucedería si el compilador no puede determinar la tipo genérico porque, por ejemplo, el tipo genérico no está relacionado con los argumentos del método.

 64
Author: Bert F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-15 15:30:19

Necesita mover el parámetro type al nivel de método para indicar que tiene un método genérico en lugar de una clase genérica:

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;
    }
}
 7
Author: axtavt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-10 13:09:29