«Itreatable нельзя бросить, чтобы перейти в список <элемент>» - не `Это тип` Iterable`
-
08-10-2019 - |
Вопрос
Я позвонил А. getElements
метод, который возвращает Iterable<Element>
.
Я сделал это:
List<Element> elements = (List<Element>) getElements();
Это генерирует ошибку:
java.lang.ClassCastException: com.utesy.Element$3
cannot be cast to java.util.List
Я думал А. List
был типом Iterable
?
Решение
Да, List<T>
расширяться Iterable<T>
, но это не значит, что вы можете бросить из Любые Iterable<T>
к List<T>
- только тогда, когда ценность фактически относится к экземпляру типа List<T>
. Отказ Это совсем возможно для реализации Iterable<T>
без реализации остальных List<T>
Интерфейс ... В этом случае что бы вы ожидали произойти?
Чтобы положить его в более простые условия, давайте изменим Iterable<T>
к Object
а также List<T>
к String
. String
расширяться Object
, так что вы можете пытаться отбрасывать от Object
к String
... но актеры преуспеют только в исполнении, если ссылка фактически относится к A. String
(или ноль).
Другие советы
Вы можете превратить врасплох в список с
List<Element> elements = Lists.newArrayList( getElements() );
List<Element>
это тип Iterable<Element>
, но это не значит, что все Iterable<Element>
Объекты List<Element>
объекты. Вы можете бросить List<Element>
как а Iterable<Element>
, но не наоборот.
Яблоко - это тип фруктов, но это не значит, что все фрукты - яблоки. Вы можете бросить яблоко как фрукт, но не наоборот.
почему бы нет:
Iterable<Element> i = ...; //is what you have
List<Element> myList = new LinkedList<Element>();
for (Element e:i) {
myList.add(e);
}
? Не нуждается в Google lib.
Список расширяет коллекцию, которая в свою очередь расширяется. Поэтому вы пытаетесь отбрасывать в подтип, который не будет работать, если GetElements () действительно не возвращает список (который подпись никоим образом не гарантирует).
Видеть: http://download.orcle.com/javase/1.5.0/docs/api/java/util/list.html.
List
это поддержание из Iterable
Это означает, что список включает в себя почти все, что имеет, однако, не наоборот. Таким образом, не все методы в экземпляре списка будут иметь эквивалент в стерестве.
Старайтесь избегать такого рода кастинга.
Я бы порекомендовал вам быстро посмотреть на Java 6 API и учебники, охватывающие кастинг
От сообщения об исключении ясно, чтоIterable<Element>
не является лиц List<Element>
Так что вам нужно вернуться List<Element>
от getElements()
Список реализует интерфейс ITERABLE, но это не означает, что IteSeable можно отдать в список. Итализируемый гораздо более общий и может быть хэш или некоторым экзотическим типом, который не имеет никакого отношения к списку. (Похоже, что Getelements () возвращает экземпляр некоторых анонимных внутренних классов, содержащихся рядом со желаемыми в своем классе).
Если бы полученные получения будут содержать списки, то это будет действительным литым. Поскольку тип, возвращенный GetElements (), не был на самом деле списком, это дает ошибку выполнения.
Не все Iterable
S List
S, таким образом, не безопасно бросить произвольное Iterable
к А. List
.
Взять любого Set
например, А. HashSet
является Iterable
но элементы не имеют порядка, поэтому он не может реализовать List
интерфейс, и поэтому не является List
.
Вы можете попытаться поставить охрану с instanceof
:
if (AnElement instanceof AList){
//cast
AList = (AnList)Element
}