Коллекции не обеспечивают безопасность выполнения, они обеспечивают безопасность времени компиляции. Но я читал, что массивы обеспечивают время выполнения, а также безопасность времени компиляции.
Поскольку списки построены поверх массива, они также могут обеспечить безопасность выполнения. Но почему это не предусмотрено?
Если мы посмотрим на исходный код ArrayList, массив объявляется следующим образом: http://www.docjar.com/html/api/java/util/ArrayList.java.html
private transient Object[] elementData;
не может быть изменено на
private transient T[] elementData;
Объявление T[]
не проверяет его во время выполнения, поэтому во время выполнения параметр T стирается и уменьшается до нижней границы, то есть Object, поэтому он фактически будет Object[]
любом случае.
Это связано с тем, что Java реализует generics с стиранием, поэтому тот же.class файл используется для ArrayList<String>
а также для ArrayList<Integer>
. Это означает, что после компиляции они совпадают в памяти JVM.
Чтобы иметь "реальные" разные массивы, то есть String[]
в одном и Integer[]
в другом, который даст вам проверки времени выполнения, вам понадобится два разных класса. Или, по крайней мере, массовое использование рефлексии, которая замедлит работу немного.