2011-12-31 3 views
1

В этом случае я попаду прямо в проблему. Это метод, который я до сих пор:Как я могу построить массив параметризованного типа?

public T[] getAllValues() { 
    Serializable[] result = new Serializable[sets.size()]; 
    for (int i = 0; i < sets.size(); i++) { 
     result[i] = sets.get(i).getValue(); 
    } 
    return (T[]) result; 
} 

«Т» является параметризованным типом, который расширяет Сериализуемым. 'sets' - это ArrayList, содержащий тип String (key) и T (value), , поэтому getValue() возвращает T. . В этом методе я хочу вернуть все Ts в массив, поэтому что бы я на самом деле хотел бы сделать больше похож на это:

public T[] getAllValues() { 
    T[] result = new T[sets.size()]; 
    for (int i = 0; i < sets.size(); i++) { 
     result[i] = sets.get(i).getValue(); 
    } 
    return result; 
} 

так Сериализуемый массив, который разливается в массив T была только идея, как работы вокруг, но не работает, к сожалению. Но в то же время, я не могу использовать второй вариант, потому что

new T[int]; 

, очевидно, не представляется возможным построить, когда тип спараметрирован. Почему это? И что еще более важно: как я могу обойти это?

Спасибо заранее

EDIT: Я решил проблему, это то, что я придумал:

public T[] getAllValues(T[] typearray) { 
    for (int i = 0; (i < typearray.length) && (i < sets.size()); i++) { 
     typearray[i] = sets.get(i).getValue(); 
    } 
    return typearray; 
} 
+4

Вкратце: невозможно создать общие массивы. См. Http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation – Robin

+0

Добро пожаловать в Java-генераторы. –

+0

@Tom О вашем решении в редактировании: вам следует избегать использования входных аргументов для вывода. Это довольно запутанно для других разработчиков, или для будущего вас. Возвращение же массива также добавляет к путанице. – toto2

ответ

1

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

Использование List<T> (или Set<T>) вместо массива решает все ваши проблемы.

Помимо комментариев:
Я не уверен, что вы делаете, но это, кажется, что вместо того, чтобы иметь sets, который содержит список пар (String, T), вы могли бы иметь Map<String, T>. Вам не понадобится ваш метод getAllValue(), так как map.values() возвращает Collections<T> всех T.

+0

Я решил проблему, и я использовал массив. –