Первая ошибка компиляции возникает из-за того, что параметры типа, объявленные методами, определяются вызывающей стороной, а не реализацией метода.То есть, учитывая
class Class3 extends BaseClass implements Interface { ... }
, вызывающая сторона может написать
Class3 c3 = new Class1().<Class3>getTwo();
, но реализация метода возвращает Class2
, который не является подтипом T
= Class3
.
Вторая ошибка компиляции возникает из-за того, что параметры типа, которые явно не указаны вызывающей стороной, выводятся из аргументов метода и типа переменной, которой назначено возвращаемое значение метода.Этот вывод не удается здесь.Обычный обходной путь, рекомендованный Спецификацией языка Java, заключается в явном указании параметров типа в таких случаях (вывод типа предназначен для удобства простых случаев; он не предназначен для охвата всех случаев).
Что касается того, как правильно объявить этот параметр типа, мне нужно знать, что вы пытаетесь выполнить с помощью этих объявлений.