将超类型的数组转换为子类型

luk*_*657 3 java arrays casting

是否有特殊原因导致 Java 中的运行时异常而不是编译时错误?

Object[] objects = new Object[10];
String[] strings = (String[])objects;
Run Code Online (Sandbox Code Playgroud)

Pat*_*han 5

由于这种情况,必须在运行时进行检查:

public class Test {
  public static void main(String[] args){
    String[] stringsBase = {"aaa", "bbb", "ccc"};
    Object[] objects = stringsBase;
    String[] strings = (String[])objects;
    System.out.println(strings[1]);
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个有效的工作程序。如果不进行流分析,编译器将不知道对象是引用作为 Object[] 创建的数组,还是在本例中创建为 String[] 的数组。

  • @MattBall - JLS 不需要实现来这样做,因为在许多情况下这是不可能的(例如,如果在第一次转换之后,该值被用作反转转换的方法的参数)。 (2认同)