Я изучаю стирание шрифтов. Я знаю, что после стирания типа общие типы становятся либо объектом, либо верхней границей. Но если универсальные типы становятся объектами, не теряется ли безопасность типов?
Например, в приведенном ниже примере: -
List<String> a = new ArrayList<String>();
a.add(10) // I can't do this, but after type erasure the generic type becomes object so where is
the check for the type?
Любая помощь приветствуется
Проверка происходит во время компиляции. Если вы скомпилируете пример программы, вы получите ошибку:
error: no suitable method found for add(int)
a.add(10);
^
method Collection.add(String) is not applicable
(argument mismatch; int cannot be converted to String)
method List.add(String) is not applicable
(argument mismatch; int cannot be converted to String)
Это показывает, чтоList
не позволяет вам добавить int, поскольку это не String и не может быть преобразовано в String.
add(...)
, поскольку он привязан кT
, который являетсяString
и ниint
Integer
не могут быть присвоеныString
. Помните: эта проверка выполняется компилятором, а не средой выполнения. Turing85String s = list.get(0);
существует неявное приведение типа результатаget
кString
. Вы должны увидеть неявное приведение типов в файле класса какcheckcast
... но JIT-компилятор может оптимизировать его. (См. Второй дуплинк.) Stephen C