2012-02-16 4 views
7

Как C++ олдтаймеры мне удалось решить мою проблему, но я не могу обернуть мою голову вокруг основных механизмов Java здесь:Список Java против ArrayList

Vector<Object> x = new Vector<Object>();  // OK 
ArrayList<Object> y = new ArrayList<Object>(); // OK 
List<Object> zzz = new ArrayList<Object>();  // OK solves problem below but question remains 
List<Object> z = new List<Object>();   // WHY? Compiler error: Cannot instantiate 

ответ

14

List представляет собой интерфейс, несколько как класс с некоторыми = 0 методов в C++. Вы не можете создать экземпляр.

Но ArrayList<T> «наследует» List<T> (или на языке Java, реализует его), поэтому эти ссылки совместимы с назначением.

+0

Спасибо всем. – Adam

+0

Вы, ребята, очень быстрые – Adam

+0

@Adam - дождитесь, пока вы перейдете на подстановочные знаки в Java-дженериках! :) Ответы требуют немного больше времени. –

5

Список - это интерфейс, вы не можете его инициализировать. ArrayList реализует List, поэтому вы можете назначить экземпляр ArrayList переменной .

1

Список не является классом, это интерфейс, и вы не можете создать экземпляр объекта интерфейса.

ArrayList класс, который был реализован интерфейс List так может, способный создать экземпляр объекта ArrayList и присвоить объекту List

1

List является интерфейсом. Вы не можете создать, например, интерфейс, используя оператор new. Вот почему строка List<Object> z = new List<Object>(); дает ошибку. Можно создавать экземпляры только классов.

0

List - interface, и интерфейс не может быть создан.

Используется для реализации полиморфизма. то есть ссылка типа интерфейса может содержать объект любого класса, который implements.

List<Object> zzz = new ArrayList<Object>(); 

это работает, потому что ArrayList реализует список.

1

«Интерфейс» - это как протокол, которому должен соответствовать объект.

+0

Интересный подход к использованию протоколов как аналогии. Хотя немного больше текста, что это такое, и что не может быть немного понятнее. –

+1

В этом контексте я никогда не слышал протокола. Но я понимаю, что вы имеете в виду. Я предпочитаю термин контракт: http://en.wikipedia.org/wiki/Design_by_contract – Adam

+0

@ Adam Я согласен, контракт - лучшее слово. – Benjamin

2

Да. Поскольку List - это интерфейс, а на Java вы не можете создать интерфейс. Вы можете создать экземпляр класса.

ArrayList - это класс, который реализует List <> вот почему вы можете его создать. :)

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