我想在我的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已经定义了类型。所以我喜欢摆脱它。
答案 0 :(得分:26)
你无法摆脱它。第二个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>