继承中的ArrayStoreException

时间:2014-01-01 10:59:58

标签: java inheritance

我在遇到这样的问题时正在使用继承。 我的代码如下

   public class Parent {
        public void methodParent() {
            System.out.println("Parent");
        }
   }
   public class Child extends Parent {
    public void methodParent() {
        System.out.println("override method in Child");
    }

    public void methodChild() {
        System.out.println("method in Child");
    }
   }
   public class MainTest {
    public static void main(String[] args) {
        Child[] c = new Child[10];
        Parent[] p = c;

        p[0] =  new Parent();
        c[0].methodParent();
    }
  }

堆栈跟踪

Exception in thread "main" java.lang.ArrayStoreException: com.test.Parent
    at com.test.MainTest.main(MainTest.java:10)

当我调试 检查c然后我收到了像

这样的消息
org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException: Type has not been loaded occurred while retrieving component type of array.

请帮助我了解问题所在。

4 个答案:

答案 0 :(得分:2)

请参阅ArrayStoreException

  

抛出表示已尝试存储错误   对象类型为对象数组。例如,以下内容   代码生成一个ArrayStoreException:

 Object x[] = new String[3];
 x[0] = new Integer(0);

这正是你想要做的。这不对。你在行中得到了例外:

p[0] =  new Parent();

在这里,您尝试将p分配给Parent,但根据之前的分配,它必须包含Child

完全与官方文档中显示的示例类似,ParentObjectChildInteger

答案 1 :(得分:2)

当你这样做时

    Child[] c = new Child[10];
    Parent[] p = c;

你告诉编译器p只是一个Parent数组。但是,还有一个运行时检查,该数组仍然必须包含Child引用。正是这个运行时检查失败了。

答案 2 :(得分:1)

来自docs

  

抛出此异常表示已尝试将错误类型的对象存储到对象数组中。例如,以下代码生成ArrayStoreException:

 Object x[] = new String[3];
 x[0] = new Integer(0);

这就是Parent[] p = c;

的确切情况

你应该考虑使用接口:)

答案 3 :(得分:1)

分配给变量'p'的数组的实际类型是Child []。因此,此数组只能“存储”子对象的实例。您正在尝试将父项存储到此数组,这就是抛出“数组存储异常”的原因。

将Child []分配给变量类型的Parent []很好,因为child是父项(根据您的模型)。但是,当在数组中存储对象时,jvm会在运行时检查数组的实际类型。