2

为什么这种类型的转换(数组到对象)在 Java 中是可能的,x 指的是什么?(我仍然可以通过 x 访问数组元素“s1”、“s2”、“s3”)。数组到对象的转换在哪里使用?

String[] array = {"s1","s2","s3"};  
 Object x = array;  
4

5 回答 5

5

这是可能的,因为anArray Object. 当您进行这种扩大转换时,您告诉 Java “这是一个Object并且您不需要知道关于它的任何其他信息。” 您将无法再访问数组元素,因为 plainObject不支持元素访问。但是,您可以转换 x回数组,这样您就可以再次访问其元素:

String[] array = {"s1","s2","s3"};  
Object x = array;

// These will print out the same memory address, 
// because they point to the same object in memory
System.out.println(array);
System.out.println(x);

// This doesn't compile, because x is **only** an Object:
//System.out.println(x[0]);

// Cast x to a String[] (or Object[]) to access its elements.
String[] theSameArray = (String[]) x;
System.out.println(theSameArray[0]); // prints s1
System.out.println(((Object[]) x)[0]); // prints s1
于 2013-06-26T21:39:41.420 回答
3

这称为扩大参考转换JLS 第 5.1.5 节)。 x仍然指的是数组,但 Java 只x知道Object.

x除非您将其转换回第一个,否则您无法直接访问数组元素String[]

于 2013-06-26T21:39:35.883 回答
1

Java 中的每个数组类型最终都是一种Object. 这里没有转换;这只是将子类型值分配给超类型变量的通常能力。

于 2013-06-26T21:39:34.073 回答
0

其他答案指出数组扩展Object。要回答您的最后一个问题:

数组到对象的转换在哪里使用?

这很少使用,但一个用例与varargs相关。考虑这种方法:

static void count(Object... objects) {
    System.out.println("There are " + objects.length + " object(s).");
}

为了将单个数组参数视为可变参数的元素,您需要强制转换为Object

String[] strings = {"s1", "s2", "s3"};

count(strings);         //There are 3 object(s).
count((Object)strings); //There are 1 object(s).

这是因为 varargs 参数首先是一个数组,所以当它不明确时,编译器会以这种方式处理数组参数。向上转型Object告诉编译器否则。

于 2013-06-26T21:48:10.410 回答
0

在您的代码中 x 是一个指向名称数组的字符串数组的指针。

所以你在数组中所做的任何改变也会发生在 x 上,但这似乎是无用的,因为 Object 是 String[] 的超类,所以无论你应该使用 Object,你都可以使用 String[]。

于 2013-06-26T22:13:29.260 回答