java.lang.ArrayStoreException:将不正确类型的值赋给Object [] array

时间:2018-06-10 15:53:24

标签: java

我来自C背景。我无法向Object中的Object[]添加foo(),这对我没有意义。

由于foo中的对象不是{{} {1}}但实际上是main()并没有strings[0].toLowerCase();。在一天结束时,我将指针存储到一个指针数组中,而行strings[0]不应该是无效的。很明显,我对java的理解是错误的(但我现在还是一个新的东西)。

String
编辑:谢谢大家的回答。我用google搜索" java协方差数组"感谢@Andy Turner并遇到this,讨论了这种行为。诀窍是编译器和运行时以非常不同的方式处理代码。编译器对代码很好,运行时不是。

3 个答案:

答案 0 :(得分:2)

来自ArrayStoreException的{​​{3}}:

  

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

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

仅仅因为您将String[]传递给期望Object[]的方法并不意味着它实际上是Object[]。由于您创建了String[],因此只能向其添加String个实例,并且您尝试添加StringBuilder,这是没有意义的。

请注意,如果将String[]的类型更改为Object[],它不会引发异常:

public static void main(String[] args) {
    Object[] strings = { "stringValue" };
    foo(strings, new StringBuilder()); // Perfectly fine
}

答案 1 :(得分:0)

在运行时评估您的String Array实际上是在尝试分配不同的类型。你会ArrayStoreException明确表示

  

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

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

接受对象类型作为参数甚至返回方法/函数的值通常不是一个好习惯。它们可以是多态接口,但是Object处于最高抽象级别,并且不适合用于此目的。

答案 2 :(得分:0)

您正在尝试添加Object" StringBuilder"到对象的数组" String"。在某些情况下,这可能实际上有效,如果你要分配StringBuilder值,但我不是为了避免这一点,因为我自己从未使用过它。 这里读起来很好:https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html

通常Java会为你处理指针,这使得它很难搞砸。

我希望我可以帮助你:)。