Почему следующие коды не вызывают предупреждение "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 выдает непроверенные предупреждения о приведении только для универсальных типов

Другие вопросы по тегам