有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    递归类型和相互递归类型在Java中意味着什么

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

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

    在这里列出<;T>;是递归定义的,因为它使用列表<;T>;按照它自己的定义

    类型变量绑定(<;T>;extensed Foo中的Foo)是递归的,如果它引用自身,例如

    class Bar<T extends Comparable<T>>
    

    这意味着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的类型参数