泛型类中的嵌套泛型

时间:2010-12-15 16:15:19

标签: java generics

我想在我的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 个答案:

答案 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>