2015-07-23 3 views
3

У меня странная проблема, которую я действительно не понимаю.Почему мой LinkedList не содержит метод addLast()?

Я создал LinkedList таким образом:

List<String> customList = new LinkedList<String>(); 

Если проверить тип customList с помощью list instanceof LinkedList я получаю true, так customList является LinkedList.

Теперь, если я пытаюсь выполнить метод addLast() на customList я получаю сообщение об ошибке Eclipse:

The method addLast(String) is undefined for the type List<String> 

Метод addList определен в классе LinkedList, но единственный способ, чтобы использовать этот метод для объявить customList как LinkedList, а не как список, таким образом:

LinkedList<String> customList= new LinkedList<String>(); 

или я должен использовать бросок:

((LinkedList<String>) list).addLast(...); 

Я действительно не понимаю такого поведения, есть ли кто-нибудь, кто может дать мне какой-то намек? Можете ли вы также дать мне ссылку или другую ссылку, чтобы понять эту проблему?

Заранее спасибо

ответ

9

addLast объявлен в LinkedList классе, но не в интерфейсе List. Поэтому вы можете вызвать его только с помощью переменных типа LinkedList. Однако для переменной типа List вы можете позвонить add, так как она добавляет элемент в конец List.

Когда компилятор видит переменную List, она не знает тип времени выполнения объекта, который будет назначен этой переменной. Поэтому он может позволить вам вызывать методы интерфейса List. Например, вы можете назначить своей переменной экземпляр ArrayList, который не имеет метода addLast, поэтому он не может позволить вам вызывать методы LinkedList, которые не объявлены в List (или суперинтерфейс List).

+0

Хорошо, но мой customList является LinkedList, в соответствии с экземпляром. Поэтому я ожидаю, что могу использовать весь метод LinkedList –

+1

@EmanueleGiarlini Но вы можете легко назначить экземпляр ArrayList той же переменной, а ArrayList не имеет метода addLast. Вот почему компилятор этого не позволяет. – Eran

+1

Ваш customList - LinkedList * now *, но это может быть любой вид списка позже, как объяснил Эран, поэтому компилятор не позволяет использовать методы, отличные от List. Компилятор не выполняет код (просто проверяет его на соответствие некоторым правилам), и он не может предсказать, какой customList будет во время выполнения. Если вам здесь не нужен полиморфизм, нет необходимости объявлять его как список. Вы должны проверить некоторые ссылки на полиморфизм в программировании, чтобы узнать больше об этом. –

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