0

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

public interface Foo<T extends Foo> {}

然后您可以递归声明以下类型的对象:

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

你永远不会结束它,但你永远无法满足警告:“Foo 是一个原始类型。对 Foo 类型的引用应该被参数化。非常好奇。

4

3 回答 3

6

模式通常类似于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>

于 2014-08-17T04:44:13.173 回答
4

有一种方法可以消除警告:

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

Foo<Foo<Foo<Foo<Foo<Foo<Foo<?>>>>>>> foo;
于 2014-08-17T04:41:00.957 回答
3
interface Foo<T extends Foo<T>> {}

class Bar implements Foo<Bar> {}

编译时没有警告,因为当T绑定到BarFoo<T>绑定到Foo<Bar>和 sinceBar implements Foo<Bar>时,T extends Foo<T>完全满足。

于 2014-08-17T04:45:37.387 回答