2013-07-08 2 views
1

Какова разницатипа или подкласс суперкласс типа

LinkedList<String> l1 = new LinkedList<String>(); 
List<String> l2 = new LinkedList<String>(); 

Почему l2 типа не имеет метода addFirst в то время как l1 типа имеет метод addFirst? даже если они оба имеют объект LinkedList? Вопреки тому, что я читал из Гослинг «Язык программирования Java» , который гласит, что объект будет то, что вы сделали это, чтобы быть, в этом случае я сделал это LinkedList с new LinkedList() даже если это Перечня типа

Как я должен правильно объявить тогда?

Collection<String> c = new LinkedList<String>(); 
List<String> c = new LinkedList<String>(); 
LinkedList<String> c = new LinkedList<String>(); 

ответ

8

Почему l2 типа не имеют метод AddFirst в то время как l1 типа имеют метод AddFirst?

Поскольку тип во время компиляции l2 просто List<E> и List<E> не объявляет метод addFirst.

В качестве более простого примера рассмотрим:

Object x = "hello"; 
int invalid = x.length(); // This is invalid 

Во время выполнения x будет относиться к String объекта, но и тип самой переменной является только Object, так что вы не можете вызвать метод String.length() ,

Это очень важно различать три разные термины здесь:

  • переменная, которая имеет тип, основанный на том, как он объявил
  • ссылка (например, значение ссылочного типа переменная)
  • объект (который имеет тип)

Значение переменной (если она не является примитивной переменной) является ссылкой. Эта ссылка может быть либо null, либо может ссылаться на объект типа, который совместим с назначением с типом переменной.

Таким образом, в приведенном выше примере:

  • Тип x является Object
  • Значение x является ссылкой
  • Эта ссылка относится к объекту типа String во время выполнения
+0

Спасибо за ваш ответ! Итак, вы имеете в виду ... Я всегда должен убедиться, что тип во время компиляции должен дополнять объект, на который указывает ссылка во время выполнения. – krato

1
LinkedList<String> l1 = new LinkedList<String>(); 

Здесь l1 - экземпляр из LinkedList

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

Здесь l2 является экземпляром списка

l2 не имеет метод AddFirst, потому что интерфейс Список не содержит этот метод в то время как LinkedList содержит это. Но в любое время в вашем коде вы можете отдать свой l2 в linkedList и вызвать метод addFirst().

0

Список l2 = новый LinkedList();

Это полезно, если у вас есть метод, который принимает только экземпляр SuperClass. С SubClassестьSuperClass, вы можете использовать экземпляр SubClass и рассматривать его как SuperClass.

Это полиморфизм. Это позволяет вам изменить реализацию внутренних компонентов класса, не нарушая остальную часть вашего кода.

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