今天我注意到,如果你在 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>完全满足。