Вложенное генерическое в родовом классе

Я хочу предоставить что-то подобное в моем api:

class Foobar extends AbstractThing<Double>

class EventThing<Foobar> {    
            public Foobar getSource();
            public Double getValue();
}

Итак, я пишу это:

class EventThing<T extends AbstractThing<U>> {    
        public T getSource();
        public U getValue();
}

Но java не может разрешить U.

С EventThing<T extends AbstractThing<U>,U> вместо этого он работает, но второй U на самом деле избыточен, потому что AbtractThing определяет Type уже. Поэтому я люблю избавляться от него.

Ответ 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>