泛型类中的嵌套泛型

Mar*_*hke 12 java generics

我想在我的api中提供类似的东西:

class Foobar extends AbstractThing<Double>

class EventThing<Foobar> {    
            public Foobar getSource();
            public Double getValue();
}
Run Code Online (Sandbox Code Playgroud)

所以我写这个:

class EventThing<T extends AbstractThing<U>> {    
        public T getSource();
        public U getValue();
}
Run Code Online (Sandbox Code Playgroud)

但java无法解决U.

随着EventThing<T extends AbstractThing<U>,U>代替它的工作原理,但第二个U实际上是多余的"导致AbtractThing已定义的类型.所以我喜欢摆脱它.

Jes*_*per 28

你无法摆脱它.第二个U不是多余的.您希望编译器将第U一个解释为类型参数,但它不会.你也可以这样写:

class EventThing<T extends AbstractThing<Double>>
Run Code Online (Sandbox Code Playgroud)

请注意,Double在这种情况下是具体类,而不是类型参数.将此与以下内容进行比较:

class EventThing<T extends AbstractThing<U>>
Run Code Online (Sandbox Code Playgroud)

请注意,这与上面第一行代码的格式完全相同.编译器应该如何知道在第一种情况下,Double它是一个具体的类,而在第二种情况下,U是一个类型参数?

编译器无法知道这一点,并将其U视为具体类,就像Double在第一行中一样.让编译器知道这U是一个类型参数的唯一方法是将其指定为:

class EventThing<T extends AbstractThing<U>, U>
Run Code Online (Sandbox Code Playgroud)

  • @Marcel:我认为这个答案很清楚地解释了为什么编译器不能(也不应该)试图猜测`U`是实际类型还是泛型类型参数.Java要求明确声明每个泛型类型参数.无论你看起来如何,这都不是"编译器缺失的功能". (4认同)
  • @ColinD 澄清一下:我从不建议使用特殊字符。这是吉利德的主意,不是我的!除此之外我仍然认为我的起源想法是一种缺失的特征。唯一的问题是,编译器无法处理它,因为它不希望在这个位置有一个新的类型参数。我不认为它会破坏某些东西或不一致。这就像 jre7 中的钻石思维。该功能不是必需的,但至少对某些人来说它似乎很有用。顺便说一句:我仍然更喜欢 Lists.newXyzList() 而不是 new XyzList&lt;&gt;()。 (2认同)