Почему этот массив 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]