Ниже приведен фрагмент о том, как сделать универсальный класс 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;
}
}
Ответы:
единственное, что вы можете сделать, это изменить свою подпись на
Важные детали:
Общие выражения, предшествующие возвращаемому значению, всегда вводят (объявляют) новую переменную универсального типа.
Кроме того, переменные типа между типами (
ArrayUtils
) и статическими методами (appendToArray
) никогда не мешают друг другу.Итак, что же это значит: В моем ответе
<E>
скрыть быE
от ,ArrayUtils<E>
если метод не будетstatic
. И не<E>
имеет ничего общего сE
отArrayUtils<E>
.Чтобы лучше отразить этот факт, более правильным ответом будет:
источник
E
и статической переменной типа методаE
. Я считаю, что гораздо лучше использовать другое имя переменной при объявлении обобщенных методов, статических или иных, внутри обобщенных классов.Обратите внимание
<E>
.Статические обобщенные методы нуждаются в собственном обобщенном объявлении (
public static <E>
), отдельном от обобщенного объявления класса (public class ArrayUtils<E>
).Если компилятор жалуется на неоднозначность типа при вызове статического универсального метода (опять-таки маловероятно в вашем случае, но, вообще говоря, на всякий случай), вот как явно вызвать статический универсальный метод с использованием определенного типа (
_class_.<_generictypeparams_>_methodname_
):Это может произойти, только если компилятор не может определить универсальный тип, потому что, например, универсальный тип не связан с аргументами метода.
источник
Вам нужно переместить параметр типа на уровень метода, чтобы указать, что у вас есть универсальный метод, а не универсальный класс:
источник
Я объясню это простым способом.
Обобщения, определенные на уровне класса, полностью отделены от обобщения, определенного на (статическом) уровне метода.
Когда вы видите приведенный выше код где-либо, обратите внимание, что T, определенный на уровне класса, не имеет ничего общего с T, определенным в статическом методе. Следующий код также полностью действителен и эквивалентен приведенному выше коду.
Почему статический метод должен иметь свои собственные обобщения, отличные от обобщенных классов?
Итак, всякий раз, когда вы вызываете статический метод,
JVM интерпретирует это следующим образом.
Оба дают одинаковые выводы.
источник