【问题标题】:Example 8.1.2-1 Of Java Language Specification(Mutually Recursive Type Variable Bounds)Java语言规范示例8.1.2-1(相互递归类型变量边界)
【发布时间】:2014-04-23 14:58:32
【问题描述】:

我正在阅读jls 8,但我卡在Example 8.1.2-1Mutually 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&lt;S&gt;, S extends ConvertibleTo&lt;T&gt; 是什么意思?

  • 如果我只使用 T extends ConvertibleTo&lt;S&gt; 作为 ReprChange 类的 类型参数,我会收到编译时错误吗?

【问题讨论】:

    标签: java recursion jls


    【解决方案1】:

    Java 中递归类型和相互递归类型是什么意思?

    递归类型是在其定义中使用自身的类型。最简单的例子就是链表:

    class List<T> {
        T value;
        List<T> next;
    }
    

    这里,List 是递归定义的,因为它在自己的定义中使用了 List

    类型变量绑定Foo in extends Foo)如果它引用自身,则它是递归的,例如

    class Bar<T extends Comparable<T>>
    

    这意味着 Bar 类需要一个可以与 T 进行比较的参数 T,因此 T 在其自己的定义中引用自己。

    两个事物之间的相互递归意味着它们在定义中相互引用。在这种情况下,S的定义使用T,T的定义使用S,所以它们的定义是相互递归的。

    这里的T extends ConvertibleTo, S extends ConvertibleTo是什么意思?

    S 和 T 是两种类型,S 扩展接口 ConvertibleTo 以 T 作为其类型参数的值,T 扩展接口 ConvertibleTo 以 S 作为其参数的值。这意味着 S 有一个方法 T convert() 并且 T 有一个方法 S convert()。换句话说,您可以将任何 S 转换为 T,并将任何 T 转换为 S。

    如果我只使用 T extends ConvertibleTo 作为类 ReprChange 的类型参数,我会收到编译时错误?

    是的,因为您的定义提到了一个从未定义过的名为 S 的类型参数。

    【讨论】:

    • 这是 Java 8 的新特性吗?它看起来很强大。
    • 只要我知道 Java 中的泛型,它就已经存在了,它早于 Java 8。它可能可以追溯到 Java 5,当时引入了泛型,但我无法证实这一点。
    • @Zoyd +1 谢谢它的帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2019-10-10
    • 1970-01-01
    • 2015-06-10
    • 2013-02-03
    相关资源
    最近更新 更多