Вложенный универсальный в универсальный класс
Я хочу предоставить что-то вроде этого в моем 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>