为什么以下代码不会导致“未经检查的强制转换”警告?

时间:2015-05-07 12:55:28

标签: java unchecked-cast

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

public static void main(String[] args) {
        Object x=new Object();
        String y=(String)x;
    }

2 个答案:

答案 0 :(得分:5)

  

我认为(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);

答案 1 :(得分:1)

Java编译器仅为泛型类型提供未经检查的强制转换警告