我正在阅读jls 8
,我被卡在Example 8.1.2-1,Mutually Recursive Type Variable Bounds
我搜索了stackoverflow,发现了一个问题what is a mutually recursive type?,但这不是Java。< / p>
例8.1.2-1。相互递归类型变量界限
interface ConvertibleTo<T> {
T convert();
}
class ReprChange<T extends ConvertibleTo<S>,
S extends ConvertibleTo<T>> {
T t;
void set(S s) { t = s.convert(); }
S get() { return t.convert(); }
}
递归类型和相互递归类型在Java中意味着什么?
这里T extends ConvertibleTo<S>, S extends ConvertibleTo<T>
的含义是什么?
如果我只使用T extends ConvertibleTo<S>
作为类型参数进行类ReprChange我会收到编译时错误吗?
答案 0 :(得分:4)
递归类型和相互递归类型在Java中意味着什么?
递归类型是在其定义中使用自身的类型。最简单的例子是链表:
class List<T> {
T value;
List<T> next;
}
这里,List&lt; T&gt;递归地定义,因为它使用List&lt; T&gt;。按照自己的定义。
类型变量绑定(&lt; T&gt;扩展Foo中的 Foo )如果引用自身则是递归的,例如
class Bar<T extends Comparable<T>>
意味着类Bar需要一个可以与T进行比较的参数T,因此T在自己的定义中引用自身。
两件事之间的相互递归意味着他们在定义中相互引用。在这种情况下,S的定义使用T,T的定义使用S,因此它们的定义是相互递归的。
这里T扩展了ConvertibleTo&lt; S&gt;,S扩展了ConvertibleTo&lt; T&gt;装置
S和T是两种类型,S扩展接口ConvertibleTo,T作为其类型参数的值,T扩展接口ConvertibleTo,S作为其参数的值。这意味着S有一个方法T convert()和T有一个方法S convert()。换句话说,您可以将任何S转换为T,将任何T转换为S.
如果我只是使用T extends ConvertibleTo&lt; S&gt;作为类ReprChange的类型参数我得到编译时错误?
是的,因为你的定义提到了一个名为S的类型参数,它永远不会被定义。