当前位置: 首页 > 面试题库 >

递归类型界限的使用

伏砚
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类(已检查源代码)。

我想详细了解上述可能提出的解决方案。


问题答案:

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

想象一个像

class Node {
    Node next;
}

如果您扩展该类,则会陷入困境Node

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

您也不能像这样定义它

class Node<T> {
    T next;
}

因为这样可以做任何事情T。您确实想要T那个,extends Node否则您将无法NodeNode不进行强制转换的情况下从内部使用T。不过,它适用于儿童班。

通过使用递归边界

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我可以理解前面提到的这一行在语法上意味着什么,但从给出的示例中,我无法找出

  • 查看我在某处(这里是游乐场)找到的这个Typescript4.2片段: 我的头不能绕着它。TS如何处理这件事?它怎么不卡在无限递归里?具体地说,对于和的情况,悬停在变量上显示TS将类型解析为和。这是怎么回事?

  • 我从本例中的createDataFrame调用中获得了一个StackOverflow Error。它起源于涉及java类型推理的scala代码,该代码在无限循环中调用自己。 堆栈跟踪的底部如下所示: 这与中报告的错误类似http://apache-spark-developers-list.1001551.n3.nabble.com/Stackoverflow-in-createDataFrame

  • 我来自Grails背景,最近在Micronaut使用GORM启动了一个项目。 我有以下代码: 应用程序编译和启动没有问题,但当我尝试访问url http:localhost:8080/author时,我收到以下错误: 10:25:29.431[nioEventLoopGroup-1-2]错误i.m.h.s.netty。RoutingInBoundHandler-发生意外错误:将对象[[micron

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