Безопасность типа после стирания типа? [дубликат]

Я изучаю стирание шрифтов. Я знаю, что после стирания типа общие типы становятся либо объектом, либо верхней границей. Но если универсальные типы становятся объектами, не теряется ли безопасность типов?

Например, в приведенном ниже примере: -

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?

Любая помощь приветствуется

#
Источник
  • 2
    Универсальные типы гарантируют безопасность типов во время компиляции. Следовательно, пока мы не выполняем приведение типов, нам не нужна безопасность типов во время выполнения, поскольку она была проверена во время компиляции.
  • 0
    Ok. Но у меня есть a.add (10) для списка <String>, где происходит проверка?
  • 1
    Компилятор проверяет и сообщает, что ваш код недействителен. Следовательно, вы не можете его построить и запустить. Ваша IDE, вероятно, сообщает то же самое
  • 2
    ... в параметре метода add(...) , поскольку он привязан к T , который является String и ни int Integer не могут быть присвоены String . Помните: эта проверка выполняется компилятором, а не средой выполнения.
  • 0
    add () привязан к T, поэтому после стирания типа T становится объектом, верно? Так мы получим функцию с добавлением (Object var)? как он проверяет String или Integer или что-то еще?
  • 1
    Фактически, безопасность универсального типа поддерживается за счет сочетания времени компиляции и времени выполнения. Обычно компилятор Java обнаруживает ошибки типа; например, в вашем примере. Однако, если в вашем коде используются необработанные типы и / или небезопасные преобразования, безопасность типов поддерживается проверками во время выполнения. Например, в String s = list.get(0); существует неявное приведение типа результата get к String . Вы должны увидеть неявное приведение типов в файле класса как checkcast ... но JIT-компилятор может оптимизировать его. (См. Второй дуплинк.)
Codelisting
за 1 против

Проверка происходит во время компиляции. Если вы скомпилируете пример программы, вы получите ошибку:

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.

Codelisting
Популярные категории
На заметку программисту