почему массивы примитивных типов не рассматриваются как объекты - PullRequest
3 голосов
/ 03 декабря 2011

Я знаю, что массивы в java расширяют объекты, поэтому почему их передача в качестве параметров не работает.

public static void main(String[] args) {
    foo(new Integer[]{1, 2, 3}); // 1
    foo(new int[]{1,2,3});   //2
}

static void foo(Object... params) {
    System.out.println(params[0]);
}

более того, почему он не обрабатывает массив как один параметр (строка 1)

Выходные данные при запуске выше:

1
[I@3e25a5

Ответы [ 3 ]

5 голосов
/ 03 декабря 2011

В java каждая функция с (X ...) сигнатурой принимает массив X в качестве параметра.

В первом примере вы получаете предупреждение о том, что вы передаете массив целых чисел как объект vararg без приведения. Java достаточно умен, чтобы вы могли передать его как Object [] вместо одного Object. Если вы добавите приведение к объекту [], предупреждение исчезнет.

Во втором примере массив рассматривается как ПЕРВЫЙ vararg, так как каждый массив является объектом. Он не может быть передан как массив объектов, потому что это массив примитивов.

Массивы любого типа являются объектами, поскольку вы можете проверить выполнение этого фрагмента кода

public class Test{
    public static void test(Object a) {
        System.out.println("ok");
    }

    public static void main(String args[]){
        int[] i = {1,2,3,4};
        test(i);
    }
}

Он печатает "ок", что означает, что int [] является объектом. ~

3 голосов
/ 03 декабря 2011

Я только что попробовал ваш код, и получил:

1
[I@71f6f0bf

Дело в том, что ваш метод принимает массив Object от varargs.Итак, для первого вызова params - это массив из 3 элементов, содержащих каждого отдельного Integer.Однако int s не являются Object s (класс Wrapper int, Integer, есть, но int нет), поэтому для второго вызова params является массивомединственный элемент, содержащий фактический объект массива.Этот трюк, приведенный выше, является выводом метода toString() массива.

Если бы вы заменили вызов varargs на Object[], второй вызов не скомпилировался бы, потому что int[] не являетсяObject[].

0 голосов
/ 03 декабря 2011

Объект ... интерпретирует массив как список аргументов, а не как один объект. Почему бы вместо этого не использовать Set в качестве контейнера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...