Vis*_*ant 6 java recursion jls
我正在阅读jls 8,我被卡在例8.1.2-1上,Mutually Recursive Type Variable Bounds我搜索了stackoverflow,并发现了一个什么是相互递归类型的问题?但这不是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(); }
}
Run Code Online (Sandbox Code Playgroud)
这是什么递归类型和相互递归类型在Java中意味着什么?
这T extends ConvertibleTo<S>, S extends ConvertibleTo<T>意味着什么?
如果我只是用T extends ConvertibleTo<S>作为类型参数类ReprChange我收到编译时错误?
Java中的递归类型和互递归类型是什么意思?
递归类型是在定义中使用自身的类型。最简单的例子是链表:
class List<T> {
T value;
List<T> next;
}
Run Code Online (Sandbox Code Playgroud)
这里,List<T> 是递归定义的,因为它在自己的定义中使用了 List<T>。
如果类型变量绑定( <T> 中的Foo扩展了 Foo),则它是递归的,如果它引用自身,例如
class Bar<T extends Comparable<T>>
Run Code Online (Sandbox Code Playgroud)
意味着类 Bar 需要一个可以与 T 进行比较的参数 T,因此 T 在其自己的定义中引用自身。
两个事物之间的相互递归意味着它们在定义中相互引用。在这种情况下,S的定义使用T,T的定义使用S,因此它们的定义是相互递归的。
这里 T extends ConvertibleTo<S>, S extends ConvertibleTo<T> 是什么意思?
S 和 T 是两种类型,S 扩展了接口 ConvertibleTo,并以 T 作为其类型参数的值,T 扩展了接口 ConvertibleTo,以 S 作为其参数的值。这意味着 S 有一个方法 T Convert() 并且 T 有一个方法 S Convert()。换句话说,您可以将任何 S 转换为 T,将任何 T 转换为 S。
如果我只使用 T extends ConvertibleTo<S> 作为类 ReprChange 的类型参数,我会收到编译时错误吗?
是的,因为您的定义提到了一个名为 S 的类型参数,该参数从未定义过。