2013-06-26 3 views
2

Почему этот тип преобразования (массив в Object) возможен на Java и что означает x? (Могу ли я получить доступ к элементам массива «s1», «s2», s3 "через x). Где используется массив для преобразования объектов?Расширение преобразования из массива в объект (java)

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

ответ

2

Это называется расширением ссылочного преобразования (JLS Section 5.1.5). x все еще относится к массиву, но Java знает только x как Object.

Вы не можете получить доступ к элементам массива напрямую через x, если только вы не вернете его обратно на String[].

+1

+1 Или 'Object []'. –

+0

тогда, где он используется? –

+1

Я бы использовал это преобразование только тогда, когда мне пришлось поместить такой «String []» в коллекцию (или другой массив) из «Объектов», которая должна была содержать такие разнородные элементы, единственная общая их суть в том, что они все «Объекты» '. – rgettman

1

Каждый тип массива в Java в конечном счете является видом Object. Здесь нет конверсии; это просто обычная способность присваивать значение подтипа переменной супертипа.

4

Это возможно, потому что Arrayявляется a Object. Когда вы делаете это расширяющееся преобразование, вы говорите Java «Это Object, и вам не нужно ничего знать об этом». Вы больше не сможете получить доступ к элементам массива, потому что простые Object s не поддерживают доступ к элементу. Тем не менее, вы можете бросить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 
0

Массив представляет собой класс Object. И если вы приводите ваши Object к String[]:

(String[])x 

Вы получите то, что вы хотите;)

+0

Да, вы на самом деле правы. Ошибка Typo, спасибо, что заметили! –

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). 

Это происходит потому, что параметр переменные аргументы является массивом прежде всего, поэтому, когда это неоднозначно, компилятор рассматривает этот параметр массива таким образом. Upcasting to Object указывает компилятору иначе.

0

в вашем коде x является указателем на массив строк, который именует массив.

Так что бы вы ни изменили в массиве, это тоже произойдет с x, но оно кажется бесполезным, потому что Object является супер-классом для String [], поэтому везде, где вы должны использовать Object, вы можете использовать String [].