Безопасность выполнения для массивов и коллекций в Java

1

Коллекции не обеспечивают безопасность выполнения, они обеспечивают безопасность времени компиляции. Но я читал, что массивы обеспечивают время выполнения, а также безопасность времени компиляции.

Поскольку списки построены поверх массива, они также могут обеспечить безопасность выполнения. Но почему это не предусмотрено?

Если мы посмотрим на исходный код ArrayList, массив объявляется следующим образом: http://www.docjar.com/html/api/java/util/ArrayList.java.html

private transient Object[] elementData;

не может быть изменено на

private transient T[] elementData;
  • 2
    Там нет функциональной разницы между ними. Однако, если вы хотите безопасности во время выполнения, посмотрите проверенную коллекцию Java
  • 0
    Спасибо, что сообщили мне об этом.
Показать ещё 1 комментарий
Теги:
generics
arrays
arraylist
collections

1 ответ

2
Лучший ответ

Объявление T[] не проверяет его во время выполнения, поэтому во время выполнения параметр T стирается и уменьшается до нижней границы, то есть Object, поэтому он фактически будет Object[] любом случае.

Это связано с тем, что Java реализует generics с стиранием, поэтому тот же.class файл используется для ArrayList<String> а также для ArrayList<Integer>. Это означает, что после компиляции они совпадают в памяти JVM.

Чтобы иметь "реальные" разные массивы, то есть String[] в одном и Integer[] в другом, который даст вам проверки времени выполнения, вам понадобится два разных класса. Или, по крайней мере, массовое использование рефлексии, которая замедлит работу немного.

  • 0
    На самом деле есть способы реализации массива с сохранением типов без «большого количества размышлений», но коллекция Java просто не была разработана для этого. На практике это не имеет большого значения - проверенная коллекция работает достаточно хорошо.
  • 0
    Конечно, они работают, мой ответ состоял главным образом в том, чтобы заставить его понять мотивацию, почему это не предусмотрено, о чем IIUC спросил.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню