Почему тип аргумента var-arg «слишком приближен»?

Если я правильно понимаю, Integer [] является подтипом Object [] . Вы можете, например, сделать

Object[] objs = new Integer[] { 1, 2, 3 };

Во время экспериментов с var-args я понял, что похоже, что компилятор "чрезмерно согласовывает" тип массива без очевидной причины.

Программа ниже, например, печатает 123 123 . Разве это не имело бы смысла / было бы более точно, если бы он напечатал 123 6 ?

class Test {

    public static Object combine(Object... objs) {

        if (objs instanceof Integer[]) {

            int sum = 0;
            for (Integer i : (Integer[]) objs)
                sum += i;
            return sum;

        } else {

            String concat = "";
            for (Object o : objs)
                concat += o;
            return concat;

        }
    }

    public static void main(String[] args) {
        System.out.println(combine("1", "2", "3"));  // prints 123
        System.out.println(combine(1, 2, 3));        // prints 123
    }
}

Я думаю, мой вопрос можно было бы резюмировать так: возникнет ли какое-либо противоречие / проблема, если JLS будет определен передать T [] в качестве аргумента, где T было наименьшей верхней границей типов всех данных аргументов?


Изменить: Я понимаю, что в данном конкретном случае случае, может перегрузить метод комбинировать , чтобы он также принимал Integer [] ( демонстрационный пример идеона ). Тем не менее, остается вопрос, почему был выбран этот дизайн.

9
задан aioobe 30 June 2011 в 13:41
поделиться