这是 Java 中一个众所周知的习语。参见例如这个 SO讨论。所以基本上要定义一个接口,实现它的类需要有一个方法来与其类的对象进行比较,你会这样做:
public interface IComparable<T extends IComparable<T>> {
public int compare(T item);
}
(注意:这显然是解决特定用例的一种不必要的复杂方法 - 请参阅这篇文章 -但我正在询问如何解释递归语法,更不用说特定的应用程序)。
简而言之,这是一个递归定义,没有明显的递归结束,我看不出编译器/类型系统如何实现这一点。
此外,尝试用语言表达(“IComparable 是一个类,其实例可以与实现 IComparable 接口的类的对象进行比较”)会产生一个不合逻辑的循环定义,这在哲学/逻辑/数学中是没有的,但显然是在编译器设计中可行(!)。
此外,如果原始习语语法是可以接受的,那么似乎也可以允许说:
public interface IComparable<T extends IComparable<T extends IComparable<T>>> {
public int compare(T item);
}
...但是编译器显然只允许一个级别的extend
.
任何人都可以帮助我理解这种递归通用定义吗?
更新
根据接受的答案(BartoszKP),我认为我现在理解的是以下内容:
“递归”定义不应被解读为(代表“定义取决于”关系的箭头):
[ IComparable<T> ] -------> [ IComparable<T> ]
...这是不合逻辑的(循环),而是:
[ IComparable<T> ] ----------> [ list of methods (parameterized by T) ]
\ ^
\ |
\-------> [ type bound on T ]-------/
...这不是不合逻辑的,因此在编译器中是可行的。因此,换句话说,定义IComparable
是根据它定义的方法列表和它定义的类型边界给出的,T
而后者又取决于方法列表。所以,没有递归。