Ошибки компилятора с обобщенными шаблонами подстановки Java - PullRequest
1 голос
/ 25 июня 2011

Имея следующий код:

    Stack<Integer> integers = new Stack<Integer>();
    Stack<? extends Number> numbers = integers;
    Number n = numbers.pop();
    numbers.push(3);
    numbers.push(n);

Я получаю ошибки компиляции в последних двух строках, но, хотя я об этом и подумал, я не понимаю, почему существуют ошибки компиляции.

The method push(capture#2-of ? extends Number) in the type Stack<capture#2-of ? extends Number> is not applicable for the arguments (int)

Когда я комментирую последнюю строку, я все равно получаю вышеуказанную ошибку компиляции, но из моего понимания компилятор должен иметь возможность вывести правильный тип (стек) из этих строк.

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 25 июня 2011

Последние две строки недопустимы, поскольку numbers может быть стеком любого числового типа.Рассмотрим следующий код:

Stack<Double> doubles = new Stack<Double>();
Stack<? extends Number> numbers = doubles;
Number n = numbers.pop();
numbers.push(3);
numbers.push(n);

Здесь вы пытаетесь поместить Integer в Stack<Double>, что, очевидно, неверно.

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

2 голосов
/ 25 июня 2011

Общая ковариация в Java обрабатывается на клиенте. у вас нет семантики, чтобы сказать, что стек является ковариантным, и позволить компилятору проверить, что операции, которые вы разрешаете (например, push), действительны в ковариационной модели. (толчка нет).

Особая проблема заключается в том, что вы можете сделать что-то вроде этого:

Number r = new Rational(a,b); // rationals are also numbers
number.push(r);

, что в базовой структуре подразумевает integer.push (r); // несоответствие типов

(Программирование в Scala дает кристально четкое объяснение различий между клиентом и провайдером (со / против) в главе 19. Рекомендуемое чтение, даже если вы не в Scala)

1 голос
/ 25 июня 2011
...