Есть ли способ использовать метод 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>
Разве вы не можете просто использовать '' JList и символом 'AorB []'? –
@PaulBoddington, использует ли JList '' или ' extends AorB> ', вам все равно придется преобразовать' Collection' в массив. Как вы конвертируете 'Collection расширяет AorB> 'до массива? –
ryvantage
'collection.toArray (новый AorB [collection.size()]);' –