gpt4 book ai didi

java - 处理 ArrayStoreException

转载 作者:IT老高 更新时间:2023-10-28 20:46:25 25 4
gpt4 key购买 nike

Object[] o = "a;b;c".split(";");
o[0] = 42;

抛出

java.lang.ArrayStoreException: java.lang.Integer

同时

String[] s = "a;b;c".split(";");
Object[] o = new Object[s.length];
for (int i = 0; i < s.length; i++) {
o[i] = s[i];
}
o[0] = 42;

没有。

有没有其他方法可以在不创建临时 String[] 数组的情况下处理该异常?

最佳答案

在Java中,数组也是一个对象

您可以将 子类型 的对象放入 父类(super class)型 的变量中。例如,您可以输入 String对象变成 Object变量。

不幸的是,Java 中的数组定义在某种程度上被破坏了。 String[]被视为 Object[] 的子类型,但这是错误!有关“协变和逆变”的更详细解释,但其本质是:只有当子类型满足父类(super class)型的所有义务时,一个类型才应被视为另一种类型的子类型。这意味着,如果你得到一个子类型对象而不是一个父类(super class)型对象,你不应该期望与父类(super class)型契约相矛盾的行为。

问题是String[]仅支持Object[]部分契约(Contract)。例如,您可以阅读 Object来自 Object[] 的值.你也可以阅读 Object来自 String 的值(恰好是 String[] 对象) .到目前为止,一切都很好。问题在于契约(Contract)的另一部分。你可以把任何 Object进入 Object[] .但是你不能放任何 Object进入 String[] .因此,String[]不应被视为 Object[] 的子类型,但Java规范说它是。因此我们会产生这样的后果。

(请注意,类似的情况再次出现在泛型类中,但这次正确解决了。List<String> 不是 List<Object> 的子类型;如果你想有一个共同的父类(super class)型,你需要 List<?> ,它是只读的。这也是数组应该是这样的;但事实并非如此。而且由于向后兼容,现在为时已晚改变它。)

在您的第一个示例中,String.split函数创建一个 String[]目的。您可以将其放入 Object[]变量,但对象仍然是 String[] .这就是它拒绝 Integer 的原因。值(value)。您必须创建一个新的 Objects[]数组,并复制值。您可以使用 System.arraycopy函数来复制数据,但你不能避免创建新数组。

关于java - 处理 ArrayStoreException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12369957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com