С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 3

Java LinkedList

10.04.2016, 19:54. Показов 1456. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Не могу разобраться с одним моментом.

Стартовые условия:

Java
1
2
3
4
5
6
7
8
class Animal{
}
 
class Cat extends Animal {
}
 
class Dog extends Animal{
}
У LinkedList есть метод addAll который принимает на вход другую любую коллекцию и добавляет ее в текущий LinkedList у которого ты вызываешь метод.
public boolean addAll(Collection<? extends E> c) { .... }
Если я правильно понимаю - есть одно ограничение: коллекция, которую добавляем должна содержать элементы, тип которых ниже по иерархии от типа текущей коллекции
Java
1
2
3
4
5
6
LinkedList<Animal> listAnimal = new LinkedList<Animal>();
LinkedList<Cat> listCat = new LinkedList<Cat>();
LinkedList<Dog> listDog = new LinkedList<Dog>();
 
listAnimal.addAll(listCat);   // Ok
listCat.addAll(listDog);      // Compile error
То есть тут все понятно, мы можем в список с животными засунуть котов, потому что коты животные. Но мы не можем в список с котами засунуть собак, потому что собаки не коты! Аминь!

Но дальше нужна помощь, никак не могу дойти самостоятельно:
у LinkedList есть конструктор с помощью которого мы можем создать LinkedList на основе другой коллекции. Реализация этого конструктора такая:
Java
1
2
3
4
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
Сначала вызывается конструктор без параметров, в котором создается просто пустой список, а потом с помощью того же метода addAll(c) добавляем туда все методы коллекции c ! Т.е. этот же метод addAll(c) срабатывает, который нам не позволяет туда любые типы засовывать!!! так вот:

Java
1
LinkedList<Cat> listCat = new LinkedList(listDog);  // Ok
Это компилится!! Мало того элементы туда добавляются!
Если у меня в двух списках (и в listCat, и в listDog) будут какие-то элементы, то в результате я получу список listCat который будет содержать несколько котов и несколько собак. я не понимаю как оно компилится! то есть понятно, что потом с этим списком уже никак не поработаешь, потому что там разные объекты и будет выкидывать ClassCastException, но почему
Java
1
listCat.addAll(listDog);
не компилируется, а через конструктор
Java
1
listCat = new LinkedList(listDog);
скомпилируется и позволит в один список добавит элементы разных типов?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2016, 19:54
Ответы с готовыми решениями:

Проблема с LinkedList java.lang.AssertionError добавляется лишний пробел при Assert.assertEquals()
Есть своя реализация LinkedList, пытаюсь ее протестировать с помощью junit, но получаю error из-за того что добавляется лишний пробел: ...

LinkedList
Имеем ЛинкедЛист кот-ый содержит допустим 15 элементов.Как вывести последние 10 элементов, а остальное не трогать?

Свой LinkedList
Здравствуйте! Задали написать LinkedList. В итоге вот, что у меня вышло: public class LinkedList { private LinkedNode first; ...

4
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
10.04.2016, 21:47
Despicable Me, хороший вопрос!
Я порылся немного в интернете и вот что накопал.

Весь сыр бор из-за того, что в самом начале вы указываете тип коллекции, а потом нет. Если сделать так:
Java
1
listCat = new LinkedList<Dog>(listDog); //компилятор видит ошибку
Что касается
Java
1
listCat = new LinkedList(listDog); //компилятор не видит ошибку
то тут создается так называемый raw type Честно говоря, я сам не сильно понял весь механизм, но полагаю, что в данном случае компилятор не проверяет соответствие типов и просто кастит.

Я попытался выудить тип элементов создаваего листа, но не получилось
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public static LinkedList list = new LinkedList();
    //тут выдаст java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
    
    
    public static LinkedList<Object> list = new LinkedList(); 
    //тут все ок, тип Object
 
    public static void main(String[] args) throws SecurityException, NoSuchFieldException
    {
        Field stringListField = JavaTest.class.getDeclaredField("list");
        ParameterizedType stringListType = (ParameterizedType) stringListField.getGenericType();
        Class<?> stringListClass = (Class<?>) stringListType.getActualTypeArguments()[0];
        System.out.println(stringListClass); // class java.lang.String. 
    }
т.е. raw type это даже не Object, а java.lang.Class. Дальше копаться не стал.
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
11.04.2016, 00:18
Цитата Сообщение от Despicable Me Посмотреть сообщение
так вот:

Java
1
LinkedList<Cat> listCat = new LinkedList(listDog);  // Ok
Потому что это равносильно записи

Java
1
LinkedList<Cat> listCat = new LinkedList<Object>(listDog);  // Ok
соответственно в конструкторе получаем вызов addAll(Collection<? extends Object>) и всё ок.

А вот почему такое присваивание LinkedList<Cat> cats = new LinkedList<Object>(...); до сих пор не вызывает ошибки компиляции — хз. Думаю, у Оракл руки не дошли сделать такую проверку.

Вообще все IDE вызов конструктора без типа-параметра new LinkedList(listDog) подсвечивают предупреждением и правильный синтаксис:

Java
1
LinkedList<Cat> listCat = new LinkedList<>(listDog);
Добавлено через 4 минуты
Цитата Сообщение от КОП Посмотреть сообщение
public static LinkedList list = new LinkedList();
* * //тут выдаст java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
Серьёзно?

Цитата Сообщение от КОП Посмотреть сообщение
Я попытался выудить тип элементов создаваего листа, но не получилось
И не получится. Type erasure ибо.
1
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
11.04.2016, 00:41
Цитата Сообщение от korvin_ Посмотреть сообщение
Серьёзно?
неправильно я комменты развесил
ошибка разумеется не в строке с объявлением, а при попытке с помощью рефлексии вытащить тип коллекции
Цитата Сообщение от korvin_ Посмотреть сообщение
И не получится. Type erasure ибо.
вот пример, все возвращает, если тип явно задан в <>
0
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 3
11.04.2016, 08:38  [ТС]
Большущее спасибо за ответы, разобралась!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.04.2016, 08:38
Помогаю со студенческими работами здесь

C linkedlist в arraylist
Доброго времени суток! подскажите пожалуйста, как правильно организовать выбор не повторяющихся элементов c linkedlist в arraylist? ...

Синхронизация LinkedList
Подскажите пожалуйста, в чем ошибка в данном выражении private LinkedList&lt;Point&gt; VisitedEdges = Collections.synchronizedList(new...

ArrayLsit vs LinkedList
Почему ArrayList работает быстрее? private static final int size = 10000000; public static void main(String args) { ...

Работа с LinkedList
Подскажите пожалуйста где можно почитать про LinkedList и его работу. Смотрел Хорстмана, Сиерру Бэйтс, гуглил, но нормально примера как его...

LinkedList Ошибка новичка!
Всем пример! Пишу в NetBeans IDE 8.2. Начал изучать LinkedList. Простой пример: LinkedList cityNames = new LinkedList(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru