当前位置: 首页 > 知识库问答 >
问题:

递归类型边界的使用

葛烨
2023-03-14

我的一个朋友在Java API中发现了这条新闻(https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html),

Class Enum<E extends Enum<E>>

通过阅读以下文章https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html我可以理解前面提到的这一行在语法上意味着什么,但从给出的示例中,我无法找出超出Enum类的用例(查看了源代码)。

我想了解更多关于上述可能提供解决方案的可能问题。

共有3个答案

呼延震博
2023-03-14

一般来说,它对于定义超类中的一些行为很有用(例如在Enum中),它取决于特定于所讨论的类的子类型的类型信息(我实际上不久前问了一个类似的问题)。

廉实
2023-03-14

这个成语几乎总是表示“E应该是子类的类型”。例如,您可能注意到Enum实现了Comparable

当类被扩展时,您可以得到如下结果:

//         E extends Enum<E> ┐
class AnEnum extends Enum<AnEnum> {...}

现在AnEnum也是一个可比的

我见过这个与奇怪的重复模板模式相关的习语。目的是超类可以泛指子类。

(由于Enum的子类是由编译器生成的,因此我认为实际上没有理由特别需要以这种方式声明Enum。它可能就是Enum

咸晨
2023-03-14

例如,允许子类使用自己的类型非常有用

想象一个班级

class Node {
    Node next;
}

如果扩展该类,您将无法使用节点。

class SpecialNode extends Node {
    void foo() {
        // euwww
        SpecialNode nextNode = (SpecialNode) this.next;
    }
}

你也不能这样定义

class Node<T> {
    T next;
}

因为这将允许T的任何内容。您真的需要一个扩展NodeT,或者您不能再将T用作NodeNode中的Node而不进行转换。不过,它适用于子类。

通过使用递归边界,如

class Node<T extends Node<T>> {
    T next;
}

你将T限制在自己或自己的子类中,然后允许你这样做

class SpecialNode extends Node<SpecialNode> {
    void foo() {
        SpecialNode nextNode = this.next; // type-safe!
    }
}

这样,父类和子类都可以访问其抽象级别上的所有内容—完全类型安全。

 类似资料:
  • 问题内容: 我的一个朋友在Java API(https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html)中找到了这个窍门, 并通过阅读以下文章https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html我可以理解上述行在语法上的含义,但是从给出的示例中我无法弄清

  • 问题内容: 以下两个签名是否相同? 和 问题答案: 不,两个签名不相同。根据Java语言规范的第8章: 如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。 如果满足以下所有条件,则两个方法或构造函数声明M和N具有相同的参数类型: 它们具有相同数量的形式参数(可能为零) 它们具有相同数量的类型参数 (可能为零) … 由于两种方法共享的类型参数数量不同,因此签名也不相同。 在实际情况下,使用

  • 我有一个特质,旨在加强对另一个特质的约束,例如: 如果我使用的是泛型而不是关联类型,我将能够告诉Rust < code > MyAssoc 在traits 和< code>B之间是相同的: 我如何对关联的类型做同样的事情?

  • 我知道在Java泛型中,当使用具有多个边界的类型参数时,编译器会将类型信息擦除到“最左边的边界”(即列表中的第一个类/枚举或接口)。那么为什么以下代码编译没有问题呢? 类型参数不应该被视为对象吗??(因此不允许我调用close()或append())??

  • 此代码是对更复杂代码的简化,以隔离问题: 导致以下错误: 我正在使用 Rust nightly (9c31d76e9 2016-10-03)。 该代码是一个结构,其中包含指向相同结构类型数组的 的指针。这些受累的数组被递归地称为在编写器中应用一些写入( trait约束被删除,因为它与问题无关),并且在实际代码中成为。 在某些地方,性状解析变得时髦,导致类型递归,在考虑性状解析的单态时,递归似乎相当

  • 标准 ML 没有多态递归。在模块语言中添加递归允许我们使用内函子的固定点将多态递归恢复为一种特殊情况。例如: 众所周知,多态递归使得类型推理不可判定。然而,函子定义已经包含部分类型信息,即其参数的签名。这些信息足以使类型推理再次可判定吗?