Как сделать статический метод Java Generic?

Ниже приведен фрагмент того, как сделать класс java для добавления одного элемента в массив. Как сделать appendToArray статическим методом. Добавление статики к подписи метода приводит к ошибкам компиляции.

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;
        }
}

Ответ 1

единственное, что вы можете сделать, это изменить свою подпись на

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

Важные детали:

Общие выражения, предшествующие возвращаемому значению, всегда вводят (объявляют) новую типичную переменную типа.

Кроме того, типы переменных между типами (ArrayUtils) и статические методы (appendToArray) никогда не мешают друг другу.

Итак, что это значит: В моем ответе <E> будет скрывать E от ArrayUtils<E>, если метод не будет static. И <E> не имеет ничего общего с E от ArrayUtils<E>.

Чтобы лучше отразить этот факт, более правильным ответом было бы следующее:

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

Ответ 2

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

Обратите внимание на <E>.

Статические общие методы нуждаются в собственном обобщенном объявлении (public static <E>) отдельно от объявления общего класса (public class ArrayUtils<E>).

Если компилятор жалуется на неоднозначность типа при вызове статического универсального метода (опять-таки вряд ли в вашем случае, но, вообще говоря, на всякий случай), здесь, как явно вызвать статический общий метод с использованием определенного типа (_class_.<_generictypeparams_>_methodname_):

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

Это произойдет, только если компилятор не сможет определить общий тип, потому что, например, общий тип не связан с аргументами метода.

Ответ 3

Вам нужно переместить параметр типа на уровень метода, чтобы указать, что у вас есть общий метод, а не общий класс:

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;
    }
}