2010-12-10 3 views
117

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

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

Какие ошибки компиляции вы получаете? Кроме того, почему бы просто не использовать один из стандартных контейнеров библиотеки? – 2010-12-10 13:08:09

+1

Ошибка компиляции: я на самом деле добавлял статический модификатор неправильно. Использование Коллекций: Да, с использованием коллекции было бы идеально, но вопрос не в коллекциях, а в массиве, для моего использования нужен массив. – 2010-12-10 13:30:54

ответ

210

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

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

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

Generic выражений, предшествовавших возвращаемое значение всегда вводить (объявлять) новый общий тип переменная.

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

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

Чтобы отразить этот факт лучше, более правильный ответ был бы:

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

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

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; 
    } 
} 
57
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"); 

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

Смежные вопросы