Java - ArrayList и ArrayList <Object>- это два разных класса? - PullRequest
4 голосов
/ 20 февраля 2012

Если так, в чем разница между этими двумя? Есть ли на самом деле два отдельных определения классов в библиотеке Java? Один для старого ArrayList и один для нового универсального? Это чисто вопрос из любопытства.

Ответы [ 6 ]

6 голосов
/ 20 февраля 2012

Существует только один класс ArrayList, но он поддерживает дженерики, что означает, что вы можете аннотировать его типом. Однако это необязательно (в основном для обратной совместимости), поэтому вы также можете продолжать использовать необработанный тип (но это не рекомендуется).

Обратите внимание, что универсальные шаблоны Java имеют место только для компилятора, во время выполнения сам экземпляр ArrayList не знает, какой универсальный тип вы ему присвоили. Это означает, что он работает точно так же, если вы аннотируете его или нет.

В отличие от массивов, нет новых отдельных классов для универсальных коллекций. Таким образом, хотя класс Integer[] отличается от String[] (или Integer[][]), класс для ArrayList<String> такой же, как для ArrayList<Integer>ArrayList<?>, ArrayList и ArrayList<List<Integer>>).

И, в отличие от массивов, в дженериках нет ничего особенного для использования коллекциями (хотя это остается их самым популярным приложением). Один и тот же механизм может использоваться для совершенно разных вещей, например, Callable.

4 голосов
/ 20 февраля 2012

Нет, это один и тот же класс, в котором только один файл класса. Существующие классы API были «обобщены» таким образом, что старый код можно было продолжать компилировать без изменений и прекрасно взаимодействовать с новым кодом, использующим новые функции.

1 голос
/ 20 февраля 2012
  • ArrayList: устарел (не параметризован). Используется только для обратной совместимости. Создает предупреждение.

  • ArrayList<Object>: список объектов на основе массива.

  • ArrayList<? extends Object>: Список на основе массива некоторого типа Object.
    Например, может ссылаться на ArrayList<Integer>, ArrayList<String> или просто на ArrayList<Object>.

1 голос
/ 20 февраля 2012
ArrayList<Object> a1 = new ArrayList<Object>();
ArrayList a2 = new ArrayList();

boolean same = a1.getClass().equals(a2.getClass());
System.out.println("same="+same);

Это печатает "true".Оба массива фактически являются объектами одного класса.

1 голос
/ 20 февраля 2012

Они одинаковые.Общие ограничения типов применяются во время компиляции, но никакой информации о типах фактически нет во время выполнения.Это называется стиранием типа, и это означает, что во время выполнения на самом деле невозможно определить, с каким универсальным типом (ами) был объявлен экземпляр.См. эту страницу Википедии для получения дополнительной информации.

1 голос
/ 20 февраля 2012

Они одного и того же класса, на самом деле разница находится только в контроллере типов.

ArrayList<T> - это просто аннотация для компилятора, позволяющая принудительно добавлять в конкретный список только объекты типа T, и, следовательно, она автоматически позволяет извлекать объекты из коллекции, которые уже имеют тип * 1005. *.

Этот механизм, который называется параметрический полиморфизм , был добавлен в Java начиная с версии 5 и реализован посредством стирания типов: компилятор будет гарантировать, что вы используете класс просто с правильными типами, как вы определили, но во время выполнения будет использоваться старый ArrayList.

Они точно того же класса, действительно.

...