Java语言规范的递归示例8.1.21(相互递归类型变量边界)
我在读jls 8
,我被Example 8.1.2-1卡住了,Mutually Recursive Type Variable Bounds
我搜索了stackoverflow,发现了一个问题what is a mutually recursive type?,但这不是Java方面的问题
例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的类型参数,我会得到编译时错误吗
# 1 楼答案
递归类型和相互递归类型在Java中意味着什么
递归类型是在其定义中使用自身的类型。最简单的例子是链表:
在这里列出<;T>;是递归定义的,因为它使用列表<;T>;按照它自己的定义
类型变量绑定(<;T>;extensed Foo中的Foo)是递归的,如果它引用自身,例如
这意味着Bar类需要一个可以与T进行比较的参数T,所以T在自己的定义中引用自己
两个事物之间的相互递归意味着它们在定义中相互引用。在这种情况下,S的定义使用T,T的定义使用S,因此它们的定义是相互递归的
在这里什么不能扩展敞篷车<;S>;,S扩展了敞篷车<;T>;是什么意思
S和T是两种类型,S扩展接口可转换对象,将T作为其类型参数的值,T扩展接口可转换对象,将S作为其参数的值。这意味着S有一个方法T convert(),T有一个方法S convert()。换句话说,你可以把任意的S转换成T,把任意的T转换成S
如果我只使用T扩展可转换到<;S>;作为类ReprChange的类型参数,我得到了编译时错误
是的,因为您的定义提到了一个从未定义过的名为S的类型参数