为什么以下代码不会导致 "unchecked cast" 警告?
Why doesn't the following codes cause "unchecked cast" warning?
我认为(String)x
是未经检查的转换,但编译器没有给出任何警告。为什么会这样?
public static void main(String[] args) {
Object x=new Object();
String y=(String)x;
}
I think that (String)x
is an unchecked cast
不,不是。它在执行时进行检查 - 如果转换无效,它将抛出异常。
未经检查的强制转换是指看起来 会检查的强制转换,但由于类型擦除,实际上不会检查您期望的所有内容。例如:
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>
这样的概念。
所以在我们的示例中,通过 "real" 检查,强制转换成功了,而 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);
Java 编译器仅针对泛型类型给出未经检查的转换警告
我认为(String)x
是未经检查的转换,但编译器没有给出任何警告。为什么会这样?
public static void main(String[] args) {
Object x=new Object();
String y=(String)x;
}
I think that
(String)x
is an unchecked cast
不,不是。它在执行时进行检查 - 如果转换无效,它将抛出异常。
未经检查的强制转换是指看起来 会检查的强制转换,但由于类型擦除,实际上不会检查您期望的所有内容。例如:
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>
这样的概念。
所以在我们的示例中,通过 "real" 检查,强制转换成功了,而 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);
Java 编译器仅针对泛型类型给出未经检查的转换警告