Java语言规范的示例8.1.2-1(相互递归类型变量边界)

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我收到编译时错误?

Zoy*_*oyd 4

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 的类型参数,该参数从未定义过。