我认为(String)x是未经检查的强制转换,但是编译器没有给出任何警告。为什么会发生?

public static void main(String[] args) {
        Object x=new Object();
        String y=(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()的调用隐式执行了强制转换。

就VM而言,示例代码是有效的:
List strings = new ArrayList();
Object mystery = strings;
List integers = (List) mystery;
integers.add(0);
String x = (String) strings.get(0);

10-07 16:19
查看更多