我认为这(String)x是未经检查的强制转换,但编译器没有给出任何警告。为什么会这样?
public static void main(String[] args) {
Object x=new Object();
String y=(String)x;
}
我认为这(String)x是未经检查的强制转换,但编译器没有给出任何警告。为什么会这样?
public static void main(String[] args) {
Object x=new Object();
String y=(String)x;
}
我认为这
(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所指的是 a List- 而不是 a List<Integer>。该Integer部分没有被检查,因为没有List<Integer>执行时的概念。
因此,在我们的示例中,该强制转换在“真正的”检查不会成功的情况下成功 - 并且add调用工作正常,因为这只是Object[]用一个Integer元素填充 an 。最后一行失败,因为调用get()隐式执行强制转换。
就虚拟机而言,示例代码实际上是:
List strings = new ArrayList();
Object mystery = strings;
List integers = (List) mystery;
integers.add(0);
String x = (String) strings.get(0);
Java 编译器仅针对泛型类型提供未经检查的强制转换警告