Почему следующие коды не вызывают предупреждение "unchecked cast"?
Я думаю что (String)x
является непроверенным приведением, но компилятор не выдает никакого предупреждения. Почему это происходит?
public static void main(String[] args) {
Object x=new Object();
String y=(String)x;
}
2 ответа
я думаю что
(String)x
это непроверенный актерский состав
Нет, это не так. Это проверяется во время выполнения - если приведение неверно, оно выдаст исключение.
Непроверенные приведения - это приведения, которые выглядят так, как будто они выполняют проверку, но на самом деле не проверяют все, что вы ожидаете, из-за стирания типа. Например:
List<String> strings = new ArrayList<>();
Object mystery = strings;
List<Integer> integers = (List<Integer>) mystery;
integers.add(0); // Works
String x = strings.get(0); // Bang! Implicit cast fails
Здесь актерский состав (List<Integer>) mystery
только проверяет, что объект mystery
относится к это List
- не List<Integer>
, Integer
часть не проверяется, потому что нет такого понятия, как List<Integer>
во время исполнения.
Так что в нашем примере это приведение происходит успешно там, где его не будет с "реальной" проверкой - и add
вызов работает нормально, потому что это просто заполнение Object[]
с Integer
элемент. Последняя строка терпит неудачу, потому что вызов get()
неявно выполняет приведение.
Что касается виртуальной машины, пример кода эффективен:
List strings = new ArrayList();
Object mystery = strings;
List integers = (List) mystery;
integers.add(0);
String x = (String) strings.get(0);
Компилятор Java выдает непроверенные предупреждения о приведении только для универсальных типов