Почему переменная типа Object может содержать ссылку на массив в Java? - PullRequest
1 голос
/ 06 августа 2020

Согласно JLS, в разделе 1.1 , говорится, что:

Переменная типа класса Object может содержать пустую ссылку или ссылку на любой объект, независимо от того, экземпляр класса или массив.

Это означает, что

Object obj = new Object[10];

допустимо в Java. Я понимаю, что это можно сделать, я хочу понять, есть ли для этого правильное применение.

Примечание : я не уверен, что это повторяющийся вопрос, но я не нашел правильный ответ на этот вопрос в Stackoverflow, возможно, я ищу неправильные ключевые слова, если ответ уже существует, направьте меня туда.

Ответы [ 3 ]

0 голосов
/ 06 августа 2020

Это возможно, потому что Object является суперклассом всего, что не является примитивным типом данных. Поскольку массивы являются сложными типами данных, их суперклассом также является Object. Так что вы также можете написать что-то вроде этого

Object obj = new int[10];

Но только потому, что это возможно, это не означает, что вы должны это делать. В вашем примере вы нарушаете безопасность типов двумя способами. Во-первых, вы назначаете массив объекту, а во-вторых, вы создаете массив объектов. Это означало бы, что вам всегда приходилось выполнять приведение перед выполнением операции с массивом, такой как установка или чтение элемента. Также вам нужно будет вернуть элементы массива к исходному типу, если вы хотите вызвать для них какой-либо метод. Поскольку приведение типов может привести к исключениям ClassCastExceptions, их следует по возможности избегать.

0 голосов
/ 06 августа 2020

Я хочу понять, есть ли для этого правильное применение.

Есть. Иногда необходимо написать код, в котором можно использовать переменную для ссылки на «любой объект вообще». Например:

  • Generi c типы данных контейнера. Желательно иметь возможность помещать «любой объект вообще» в список или в древовидную структуру данных без необходимости создавать специальную версию структуры данных для каждого типа ссылки. Благодаря этому вам не нужен новый специальный интерфейс List, если вы хотите поместить массивы в список, вы можете просто использовать, например, List<int[]>.
  • Reflection. Желательно иметь возможность удерживать в переменной «любой объект вообще», чтобы вы могли задавать вопросы по этому поводу, например, «какой тип этого объекта» или «какие члены есть у этого объекта». Если вы не могли использовать тип Object для ссылки на массивы, вам нужно было бы написать новые, более специализированные методы.
  • Метод System.arrayCopy. Этот метод копирует элементы из одного массива в другой. Массивы передаются с использованием типа Object. Благодаря этому требуется только один метод arrayCopy, а не один для каждого типа массива.
0 голосов
/ 06 августа 2020

будьте осторожны, в java почти все может быть объектом

, поэтому этот

Object obj = new Object[10];

так же действителен, как

Object obj2 = new String("Hi");

или даже

Object[] obj3 = new Object[10];

основная разница между obj и obj3 заключается в том, что с obj3 вы можете делать такие вещи, как

obj[1] = "as"

, но в obj вы не можете

public static void main (String[] args) throws java.lang.Exception
{
    Object[] obj = new Object[10];
    obj[0] = new Integer(1);
    obj[1] = "hello";
    System.out.println(obj[1]);
    Object obj2 = new Object[10];
    obj2[0] = new Integer(1);
    ^--- ERROR!
}

Я думаю, что ключ Чтобы понять, как работает ref, посмотрите это:

//CASTING
Object someString = new String("abcdf");

в этот момент someString не строка, а объект, поэтому, если вам нужно обрабатывать как строку и использовать все строковые методы, которые вам нужны, чтобы ее преобразовать в строку

System.out.println(((String)someString).toUpperCase());

попытка выполнить

System.out.println(someString.toUpperCase());

вызовет java жалобу, так как класс «объект» не имеет метода toUpperCase

...