扩展从数组到Object的转换(java)

时间:2013-06-26 21:36:59

标签: java

为什么这种类型的转换(数组到Object)可能在Java中以及x引用什么?(我仍然可以访问数组元素“s1”,“s2”,“s3”到x)。使用数组到Object转换的位置在哪里?

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

6 个答案:

答案 0 :(得分:4)

这是可能的,因为Array Object。当你进行这种扩展转换时,你告诉Java“这是一个Object,你不需要知道任何其他的事情。”您将无法再访问数组元素,因为普通Object不支持元素访问。但是,您可以强制 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

答案 1 :(得分:2)

这称为扩展参考转换JLS Section 5.1.5)。 x仍然引用数组,但Java只知道xObject

您无法直接通过x访问数组元素,除非您先将其转换回String[]

答案 2 :(得分:1)

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

答案 3 :(得分:0)

数组是Object的类。如果你将Object转换为String[]:

(String[])x 

你会得到你想要的东西;)

答案 4 :(得分:0)

其他答案指出数组扩展Object。回答你的上一个问题:

  

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

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

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

为了将单个数组参数视为varags的元素,您需要转换为Object

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

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

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

答案 5 :(得分:0)

在你的代码中x是一个指向String数组的指针,该数组命名数组。

所以你在数组中改变的东西也会发生在x上,但它似乎没用,因为Object是String []的超类,所以无论你在哪里使用Object都可以使用String []。