Вложенный универсальный в универсальный класс

Я хочу предоставить что-то вроде этого в моем 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 уже определяет тип. Поэтому я люблю избавляться от этого.

1 ответ

Решение

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

class EventThing<T extends AbstractThing<Double>>

Обратите внимание, что Double в данном случае это конкретный класс, а не параметр типа. Сравните это со следующим:

class EventThing<T extends AbstractThing<U>>

Note that this has the exact same form as the first line of code above. Как компилятор должен знать, что в первом случае, Double is meant as a concrete class, while in the second case, U подразумевается как параметр типа?

Компилятор не может этого знать и обрабатывает U as a concrete class, just like the Double в первой строке. Единственный способ сообщить компилятору, что U Параметр типа должен указывать его так:

class EventThing<T extends AbstractThing<U>, U>
Другие вопросы по тегам