我今天看core java   里边有一节给出了如下类似代码(这我做实验的,书上的跟我这个原理一样)class SuperC {
int i = 1;
}
class SubC extends SuperC{

}
public class InhTest { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
      
SubC[] subc = new SubC[10];
SuperC[] superc = subc;
superc[0] = new SuperC();
System.out.println();
}}这println()中如果调用subc.i就会出错
然后书中突然来了一段话:为了确保不发生这类错误,所有数组都要牢记创建它们的元素类型,并负责监督仅将类型兼容的引用存储到数组中。例如,使用new managers[10]创建的数组是一个经理数组(我例子中就是SubC类)。如果试图存储一个Employee类型的引用就会引发ArrayStoreException异常。(然后就下一节内容了)---汗!!
【问】:那java中的数组到底是实现了这种检查了吗?看他这段话就是实现了吧?可是为什么我在编译器里还能将父类实例引用放入子类数组中,而编译器却不报错?  郁闷

解决方案 »

  1.   

    会不会是这样:
    ArrayStoreException异常 检查首先检测 类型是否匹配,如果不匹配就看能不能自动转换,比如反过来用父类存子类,那么就能够自动砍去子类多余的数据,实现了转换。
    而你这里是子类转父类,可能因为你的子类的没有新的实例字段,导致父类也能转成子类了,所以保存成功了仅仅是猜测~~共同学习
      

  2.   

    不行啊哥们。。我在子类中加了两个域,可是编译器并没报错!  人工置顶。。class SuperC {
    int i = 1;
    }
    class SubC extends SuperC{
    int b = 2;
    boolean realy = false;
    }
    public class InhTest { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
          
    SubC[] subc = new SubC[10];
    SuperC[] superc = subc;
    superc[0] = new SuperC();
    System.out.println();
    }}
      

  3.   

    有什么问题??这个属于运行期(Runtime)异常,编译期无法检查的。编译器不是万能的,他只能检测100%必然错误的情况。举个例子,
      public static void main(String[] args) throws Exception {
        System.out.println(args[10]);
      }
    编译期可能检测出下标越界吗?——args是命令行参数,运行的时候,用户可能在命令行输入10个参数,有可能一个参数也不输入。