请查看下面的代码。
class Use
{
public static void main(String[] args)
{
String[] result = new String[2];//{"Hello", "World"}; // compiles and run
Object[] name = result; // compiles and run
// result = name; //CE
System.out.println(result);
System.out.println(name);
}
}
我的理解是Java中的数组是独立的对象,没有父子关系。因此,根据我的说法,“结果”和“名称”是两种完全不同类型的对象(即String []和Object [])的引用变量,它们没有任何关系。然后
答案 0 :(得分:0)
result = name
试图将Object数组分配给String数组。您不能将Object分配给声明为String的变量,数组也是如此。您不能将数组分配给声明为其他类型的数组的变量。
Object[] name = result
是合法的,因为所有对象都继承自Object类,包括String。如果您要分配的变量继承或实现了您要分配给变量的数据类型,则可以为声明的变量分配不同的数据类型。
要获得更好的理解,请阅读Java语言的文档。这是查看不同类之间关系的好资源。
对象类文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
字符串类文档:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html
整数类文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
答案 1 :(得分:0)
java.lang.Object
类是所有Java类的超级基类。我猜这可以解决您的困惑。 (如果B扩展为C,则表示B是C,而不是C是B。)
result = name;
抛出编译错误,因为它们属于不同类型。您需要对其进行转换,以避免编译错误。
result = (String[]) name;
如果是另外一种方法,则name=result
可以将String []分配给Object [];不是其他方式。
https://javapapers.com/java/why-object-is-super-class-in-java/
答案 2 :(得分:0)
如何将String数组引用存储在Object数组的引用变量中?
我知道“对象”和“字符串”具有父子关系。 “ Object []”和“ String []”之间有任何关系吗?
根据JLS Section 4.10.3. Subtyping among Array Types String[]
是Object[]
,因为String
是Object
,因此Object[] name = result;
是合法的。
为什么“ result = name;”语句中有错误?
鉴于上述情况,Object[]
不是不是 String[]
,这就是为什么在编译时会收到此错误的原因。
Error:(13, 26) java: incompatible types: java.lang.Object[] cannot be converted to java.lang.String[]
(毕竟,对象Object[]
的数组可以包含任何引用类型的元素,例如String
,Integer
等)
但是,根据您的代码“您知道”,实际上这个Object[] name
数组仅包含Strings
。因此Object[] name
实际上是String[]
。因此,您可以通过显式使用向下转换(即result = (String[]) name
)来使其正常工作。
通过使用向下转换,您可以向编译器明确指出此类型转换很好(因为通常不会)。然后您应该这样做违反代码中的“您的承诺”吗?
String[] strings = {"Hello", "World"};
Object[] objects = strings;
objects[0] = 1; // let's replace the string with an integer
strings = (String[]) objects;
您将在运行时收到此异常。
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer