Все о принципах и концепциях дженериков. Я берусь от примера, отправленного ijrandom. Возьмем первый сценарий, когда U и V реализуют только X. Пока мы не назначаем вывод метода в ссылочную переменную. Мы назвали метод объединения, как указано ниже:
объединение (целые числа, удваивается);
Мы знаем, что для дженериков фактический тип параметра определяется типом, который вы указываете при вызове метода, поэтому в этом случае возвращаемым типом метода будет множество X, просто переместите курсор над вызовом метода, вы увидите, как java-компилятор определил фактический тип параметра во время компиляции.
В нашем втором сценарии мы еще раз вызвать метод объединения:
объединение (целые числа, в два раза); // Обратите внимание, мы еще не приписали возвращаемое значение переменной.
Переместить курсор над вызовом метода, вы заметите, что тип возвращаемого значения для метода изменяется на Набор неизвестных расширений X, поэтому здесь компилятор не может полностью разрешить фактический тип, так как U и V реализуют как X, так и X и X не является Y. Следовательно, как только вы присваиваете значение переменной, возникает ошибка, поскольку компилятор все еще не в состоянии идентифицировать фактический тип. В таком сценарии вам нужно сообщить компилятору, какой фактический тип использовать.
Почему вы возвращаете нуль? Разве это не должно возвращать объединение двух проходов в наборах? – Geek
поведение во время выполнения не имеет значения при демонстрации проблем компиляции. – ijrandom
Хорошее объяснение. – nkr