今天我注意到如果你在Java中声明以下内容:
public interface Foo<T extends Foo> {}
然后你可以递归地声明类型的对象:
Foo<Foo<Foo<Foo<Foo<Foo<Foo... ...>>>>>> foo;
并且你永远不会结束它,但你永远无法满足警告:&#34; Foo是原始类型。应该参数化对Foo类型的引用。非常好奇。
答案 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}}完全满意