Почему этот массив int не передается как массив vararg объекта?

Я использовал этот код. Я запутался, почему этот массив int не преобразуется в аргумент vararg объекта:

class MyClass {
    static void print(Object... obj) {
        System.out.println("Object…: " + obj[0]);
    }

    public static void main(String[] args) {
        int[] array = new int[] {9, 1, 1};
        print(array);
        System.out.println(array instanceof Object);
    }
}

Я ожидал выход:

Object…: 9
true

но это дает:

Object…: [[email protected]
true

Ответ 1

Вы сталкиваетесь с крайним случаем, когда объекты и примитивы не работают должным образом. Проблема заключается в том, что реальный код в конечном итоге ожидает static void print(Object[]), но int[] не может быть приведен к Object[]. Однако его можно преобразовать в Object, что приведет к следующему выполненному коду: print(new int[][]{array}).

Вы получаете ожидаемое поведение, используя объектный массив, такой как Integer[] а не int[].

Ответ 2

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

Вы можете получить ожидаемый результат без изменения main метода и без изменения параметров, если вы сделаете это следующим образом:

static void print(Object... obj) {
    System.out.println("Object…: " + ((int[]) obj[0])[0]);
}

Выход:

Object…: 9
true

Ответ 3

Попробуйте использовать Arrays.toString

static void print(Object... obj) 
{
    System.out.print(Arrays.toString(array));
}

Таким образом, он конвертируется, и вы не получаете место в памяти.

Ответ 4

Как вы знаете, когда мы используем varargs, мы можем передавать один или несколько аргументов через запятую. Фактически это упрощение массива, и компилятор Java рассматривает его как массив указанного типа.

Документация Oracle говорит нам, что массив объектов или примитивов тоже является объектом:

В языке программирования Java массивы являются объектами (§4.3.1), создаются динамически и могут быть назначены переменным типа Object (§4.3.2). Все методы класса Object могут быть вызваны в массиве.

Поэтому, когда вы передаете int[] в метод print(Object... obj), вы передаете объект в качестве первого элемента varargs, затем System.out.println("Object…: " + obj[0]); печатает его ссылочный адрес (метод объекта по умолчанию toString()).

Ответ 5

class MyClass {
    static void print(Object... obj) {
        System.out.println("Object…: " + obj[0]);
    }

        public static void main(String[] args) {
            int[] array = new int[] {9, 1, 1};
        // To boxed array
        Integer[] oArray = Arrays.stream( array ).boxed().toArray( Integer[]::new );

            print(oArray);
            System.out.println(oArray instanceof Object);
        }
    }

Ответ 6

ToString() Array возвращает [Array type @HashCode HashCode - это число, которое вычисляется из массива. Если вы хотите получить полезную строку, вы должны использовать вместо нее java.util.Arrays.toString(array).

Например

System.out.println(new int[10].toString());
System.out.println(java.util.Arrays.toString(new int[10]));

привело к

[[email protected]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]