我在遇到这样的问题时正在使用继承。 我的代码如下
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.
请帮助我了解问题所在。
答案 0 :(得分:2)
抛出表示已尝试存储错误 对象类型为对象数组。例如,以下内容 代码生成一个ArrayStoreException:
Object x[] = new String[3]; x[0] = new Integer(0);
这正是你想要做的。这不对。你在行中得到了例外:
p[0] = new Parent();
在这里,您尝试将p
分配给Parent
,但根据之前的分配,它必须包含Child
。
完全与官方文档中显示的示例类似,Parent
为Object
,Child
为Integer
。
答案 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会在运行时检查数组的实际类型。