今天我注意到,如果你在 Java 中声明以下内容:
public interface Foo<T extends Foo> {}
然后您可以递归声明以下类型的对象:
Foo<Foo<Foo<Foo<Foo<Foo<Foo... ...>>>>>> foo;
你永远不会结束它,但你永远无法满足警告:“Foo 是一个原始类型。对 Foo 类型的引用应该被参数化。非常好奇。
今天我注意到,如果你在 Java 中声明以下内容:
public interface Foo<T extends Foo> {}
然后您可以递归声明以下类型的对象:
Foo<Foo<Foo<Foo<Foo<Foo<Foo... ...>>>>>> foo;
你永远不会结束它,但你永远无法满足警告:“Foo 是一个原始类型。对 Foo 类型的引用应该被参数化。非常好奇。
模式通常类似于interface Foo<T extends Foo<T>>
, then Bar implements Foo<Bar>>
。
枚举是一个经典的例子。基类是java.lang.Enum<E extends Enum<E>>
,并且 anenum MyEnum
实际上是 aclass MyEnum extends Enum<MyEnum>
有一种方法可以消除警告:
public interface Foo<T extends Foo<?>> {}
和
Foo<Foo<Foo<Foo<Foo<Foo<Foo<?>>>>>>> foo;
interface Foo<T extends Foo<T>> {}
class Bar implements Foo<Bar> {}
编译时没有警告,因为当T
绑定到Bar
、Foo<T>
绑定到Foo<Bar>
和 sinceBar implements Foo<Bar>
时,T extends Foo<T>
完全满足。