Как сделать статический метод 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;
}
}