«Itreatable нельзя бросить, чтобы перейти в список <элемент>» - не `Это тип` Iterable`

StackOverflow https://stackoverflow.com/questions/3959892

Вопрос

Я позвонил А. 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 (), не был на самом деле списком, это дает ошибку выполнения.

Не все IterableS ListS, таким образом, не безопасно бросить произвольное Iterable к А. List.

Взять любого Set например, А. HashSet является Iterable но элементы не имеют порядка, поэтому он не может реализовать List интерфейс, и поэтому не является List.

Вы можете попытаться поставить охрану с instanceof:

if (AnElement instanceof AList){
    //cast
    AList = (AnList)Element
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top