2013-11-19 3 views
2

У меня есть список и я пытаюсь добавить некоторые элементы типа пользовательского класса.Тип Литой объект внутри списка

List<MyCustomClass> myList = new ArrayList<MyCustomClass>(); 
myList.addAll(queryResponse.getRecords()); 

На самом деле queryResponse снова пользовательский класс, который имеет 2 участника;

private Long totalRecords; 
private List<T> records; 

Мой вопрос я хочу бросить отдельных членов myList (т.е. queryResponse.getRecords()) в MyCustomClass.

Они имеют тип «Объект» во время выполнения после выполнения запроса.

Как это сделать?

+0

Вы действительно уверены, что это кастинг, а не преобразование, вы после? Объекты, которые вы выбрали из запроса _really_ типа MyCustomClass? – Bex

+0

Если myList является объектом 'List ', вам нужно вставить в него только экземпляры 'MyCustomClass'. Просто как тот. Все остальное отбрасывает безопасность типов. 'AddAll()' может принимать только аргумент 'Colletion '. – Natix

+0

@Natix: Это не точно. addAll в этом случае принимает Коллекции любого расширения MyCustomClass (см. подпись List.addAll) –

ответ

0

Предполагая queryResponse.getRecords() возвращение Object, вы можете ввести касту это как этот

myList.addAll((MyCustomClass)queryResponse.getRecords()); 
+0

Если я это сделаю, я не получаю подходящего метода для addAll (MyCustomClass) ... в моем редакторе – testndtv

0
myList.addAll((List)queryResponse.getRecords()); 

должен работать, производя предупреждение безопасности типа. Делая это, вы обходите гарантию безопасности типа времени компиляции, поэтому вам нужно убедиться, что вы не получите ClassCastException где-то позже.

+0

Но я хочу, чтобы отдельные члены списка были в MyCustomClass – testndtv

+0

Это было бы, но это довольно опасно, потому что если элементы _aren't_ MyCustomClass, вы не заметите, пока не попытаетесь вытащить их из коллекции. – Bex

+0

@testndtv: Нет смысла бросать отдельные предметы. Все они хранятся как ссылки на Object во время выполнения. Но, как говорит Бекс, вы должны быть очень осторожны в том, как их извлекаете. Если вы попытаетесь сделать это, используя список типов List , вы получите ClassCastException, если общий тип добавленных элементов не расширяет MyCustomClass. –

0

насчет:

List<MyCustomClass> myList = new ArrayList<MyCustomClass>(); 
for (Object element : queryResponse.getRecords()) { 
    if (element instanceof MyCustomClass) { 
     // this will never fail because of the check above 
     myList.add((MyCustomClass)element); 
    } 
    else { 
     // do something here in case element has the wrong type 
     System.err.println("Found incompatible record!"); 
    } 
} 

Это использует оператор instanceof, чтобы обеспечить приведение не удастся. То, что вы делаете, когда тип объекта несовместим, зависит от ваших требований.

+0

Это не отвечает на вопрос. Обратите внимание, что addAll не компилируется в его исходном коде, а это означает, что общий тип добавленных элементов * не * распространяется на MyCustomClass. Если это так, оно будет скомпилировано из-за того, как определен метод addAll (он принимает Collection ).Другими словами, OP заинтересован в неоднородном списке (это странное дизайнерское решение, но это еще одна проблема) –

+0

@EyalSchneider Я не уверен в этом. Возможно, я неправильно понял вопрос; Я ответил так, что понял вопрос. Может быть, некоторые разъяснения от ОП помогут. –

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