java泛型中的无限嵌套

时间:2014-08-17 04:33:02

标签: java generics nested-generics

今天我注意到如果你在Java中声明以下内容:

public interface Foo<T extends Foo> {}

然后你可以递归地声明类型的对象:

Foo<Foo<Foo<Foo<Foo<Foo<Foo... ...>>>>>> foo;

并且你永远不会结束它,但你永远无法满足警告:&#34; Foo是原始类型。应该参数化对Foo类型的引用。非常好奇。

3 个答案:

答案 0 :(得分:6)

模式通常类似于interface Foo<T extends Foo<T>>,然后是Bar implements Foo<Bar>>

枚举是一个典型的例子。基类为java.lang.Enum<E extends Enum<E>>enum MyEnum实际上为class MyEnum extends Enum<MyEnum>

答案 1 :(得分:4)

有一种方法可以摆脱警告:

public interface Foo<T extends Foo<?>> {}

Foo<Foo<Foo<Foo<Foo<Foo<Foo<?>>>>>>> foo;

答案 2 :(得分:3)

interface Foo<T extends Foo<T>> {}

class Bar implements Foo<Bar> {}

在没有警告的情况下进行编译,因为当T绑定到Bar时,Foo<T>绑定到Foo<Bar>并且Bar implements Foo<Bar>绑定T extends Foo<T>,{{1}}完全满意