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

时间:2014-04-23 14:58:33

标签: java recursion jls

我正在阅读jls 8,我被卡在Example 8.1.2-1Mutually 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我会收到编译时错误吗?

1 个答案:

答案 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的类型参数,它永远不会被定义。