Сомнение коллекции дженериков Java - PullRequest
3 голосов
/ 06 августа 2011

У меня проблемы с дженериками.Я определил следующий статический метод:

public static <E extends Number> List<E> group(E ... numbers) {
    return Arrays.asList(numbers);
}

Я понимаю, почему это работает:

List<Integer> ints = group(1, 2, 3);

Но что мне нужно изменить в сигнатуре моего метода, чтобы это работало:

List<Number> ints = group(1, 2, 3);

Или я должен просто вызвать групповой метод с указанием типа Number как:

List<Number> ints = MyClass.<Number>group(1, 2, 3);

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 06 августа 2011

Вам нужно явно указать Number в качестве аргумента типа, как вы предложили.

List<Number> ints = MyClass.<Number>group(1, 2, 3);
2 голосов
/ 06 августа 2011

Вы не сможете получить List<Number>.

Если ваш метод group(1,2,3) вернет List<Integer>, и вы сказали, что это сработало, поэтому это выражение имеет тип List<Integer>

И List<Integer> - это , а не a List<Number>.Наследование означает специализацию, поэтому, если ваш List<Integer> будет своего рода List<Number>, вы можете добавить Double s к своему List<Integer> (так как суперкласс может сделать это, подкласс может сделать это тоже).И это неправильно.Это не проблема приведения, она просто отложит вашу проблему компиляции до времени выполнения.Проблема логична и довольно парадоксальна для людей, но именно так работают сбор и наследование.

Итак, если вы действительно хотите получить List<Number>, я предлагаю вам определить второй метод:

public static List<Number> groupAsNumbers(Number ... numbers) {
    return Arrays.asList(numbers);
}

С уважением, Стефан

...