2015-10-25 4 views
0

Есть ли способ использовать метод Collection::toArray(T[]), когда вы знаете только подтип коллекции?Java Collection :: toArray с подклассами

Возьмем такой пример:

void initList(Collection<? extends AorB> data) { 
    JList<? extends AorB> aorb_jlist = new JList<>(); 
    aorb_jlist.setListData(data.toArray(new T<? extends AorB>[data.size()])); 
} 

abstract class AorB {} 
class A extends AorB {} 
class B extends AorB {} 

(я просто положил T там для иллюстрации, я знаю, что не будет работать)

Все, что я знаю о Collection, что это подкласс AorB , но это может быть и то. JList принимает <? extends AorB> как его тип, но метод setListData нуждается в массиве, а Collection::toArray нуждается в вводе.

Я лаю неправильное дерево с toArray? Есть ли простой и эффективный способ преобразования этой коллекции в массив без ручного перебора?

Редактировать ответить @PaulBoddington:

Вы не можете изменить <? extends AorB> к <AorB>, потому что тогда метод не получит Коллекцию подтипов:

Пример:

void initList(Collection<AorB> data) { 
    JList<AorB> aorb_jlist = new JList<>(); 
    aorb_jlist.setListData(data.toArray(new AorB[data.size()])); 
} 

abstract class AorB {} 
class A extends AorB {} 
class B extends AorB {} 

public static void main(String[] args) { 
    LinkedList<A> a_list = new LinkedList<>(); 
    initList(a_list); 
} 

выдает ошибку:

incompatible types: LinkedList<A> cannot be converted to Collection<AorB> 
+0

Разве вы не можете просто использовать '' JList и символом 'AorB []'? –

+0

@PaulBoddington, использует ли JList '' или ' ', вам все равно придется преобразовать' Collection' в массив. Как вы конвертируете 'Collection 'до массива? – ryvantage

+0

'collection.toArray (новый AorB [collection.size()]);' –

ответ

1

Оставьте коллекцию как Collection<? extends AorB>, но сделать JList JList<AorB>:

void initList(Collection<? extends AorB> data) { 
    JList<AorB> aorb_jlist = new JList<>(); 
    aorb_jlist.setListData(data.toArray(new AorB[data.size()])); 
} 
+0

Хорошая точка, конечно, она генерирует предупреждение: 'Подозрительный вызов Collection.toArray(). Тип элемента сбора? extends AorB не присваивается массиву типа AorB'. Я вижу, как это будет работать, но это заставляет меня переоценить мое понимание того, что значит использовать ограниченные подстановочные знаки в 'JList'. – ryvantage

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