Если я правильно понимаю, 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 []
( демонстрационный пример идеона ). Тем не менее, остается вопрос, почему был выбран этот дизайн.