Ответ 1
Вы не можете избавиться от него. Второй U
не является избыточным. Вы хотите, чтобы компилятор интерпретировал первый U
как параметр типа, но это не так. Вы также могли бы написать это:
class EventThing<T extends AbstractThing<Double>>
Обратите внимание, что Double
в этом случае является конкретным классом, а не параметром типа. Сравните это со следующим:
class EventThing<T extends AbstractThing<U>>
Обратите внимание, что это имеет ту же форму, что и первая строка кода выше. Как компилятор должен знать, что в первом случае Double
подразумевается как конкретный класс, а во втором случае U
подразумевается как параметр типа?
Компилятор не может этого знать и рассматривает U
как конкретный класс, как и Double
в первой строке. Единственный способ сообщить компилятору, что U
является параметром типа, должен указывать его как таковой:
class EventThing<T extends AbstractThing<U>, U>