我来自C背景。我无法向Object
中的Object[]
添加foo()
,这对我没有意义。
由于foo
中的对象不是{{} {1}}但实际上是main()
并没有strings[0].toLowerCase();
。在一天结束时,我将指针存储到一个指针数组中,而行strings[0]
不应该是无效的。很明显,我对java的理解是错误的(但我现在还是一个新的东西)。
String
编辑:谢谢大家的回答。我用google搜索" java协方差数组"感谢@Andy Turner并遇到this,讨论了这种行为。诀窍是编译器和运行时以非常不同的方式处理代码。编译器对代码很好,运行时不是。
答案 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会为你处理指针,这使得它很难搞砸。
我希望我可以帮助你:)。