在泛型中接受自身作为类型参数有什么用

2024-01-04

我在一个不相关的问题上看到了一些代码,但这让我很好奇,因为我从未见过 Java 泛型的这种构造。创建一个可以将其本身或其后代作为类型参数的泛型类有什么用处。这是示例:

abstract class A<E extends A<E>> {
    abstract void foo(E x);
}

我首先想到的是一个以列表为参数的列表。使用这段代码感觉很奇怪,如何声明 A 类型的变量?递归声明!?

这还管用吗?如果是这样,你们有人在代码中看到过吗?它是如何使用的?


EDIT

事实证明我的问题确实是一样的this one https://stackoverflow.com/questions/211143/java-enum-definition只是措辞不同,但该问题的答案也将回答我的问题。

也感谢您的参考奇怪的重复模板模式 http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern其中提供了一些历史背景和有关该主题的进一步解释。

这个老博客条目 http://madbean.com/2004/mb2004-3/可能为我们 Java 人员提供了最好的全面解释。

现在很难在这里选择正确的答案,因为它们都很有帮助,所以我会选择最终产生最多阅读材料的答案(如上所述)


如果没有这个,方法的参数foo无法绑定到类型E.

如果你有一个实现B对于这个抽象类,您现在可以强制执行该方法foo还要求其参数的类型B.

 class B extends A<B> {
      void foo (B x){}
 }

如果没有那个,foo必须采取any有点儿A.

我同意这个语法不太优雅。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在泛型中接受自身作为类型参数有什么用 的相关文章

随机推荐

  • junit 测试-assertEquals 异常

    如何使用assertEquals来查看异常消息是否正确 测试通过了 但我不知道它是否遇到正确的错误 我正在运行的测试 Test public void testTC3 try assertEquals Legal Values Packag
  • 易失性是否足以更改对列表的引用?

    假设我们有一个列表引用 volatile List a 现在线程 1 初始化它 List newA new LinkedList lt gt newA add new String a Write to a volatile a newA
  • 使用 cookie 的 ASP.NET Web api“记住我”功能

    我正在尝试实施一个 记住账号 我的功能Web Api项目 我想 有记住账号当用户使用时的功能Sign In save a cookies用于保持用户始终登录 以便用户无需键入username and password他们每次访问网站时 通过
  • 私有属性的命名约定

    我见过下划线用作私有属性的前缀 private var aPrivateVar String I am private 我见过它们没有被使用过 private var aPrivateVar String I am private 从语法上
  • 如何使用C-API在Lua 5.1中创建表中表?

    我需要在 Lua 中创建这样的结构5 1C API 不在 Lua 5 2 及以上版本中 a b c d e GOOD print a b c d e 预期结果 良好 感谢您的解答 Lua C API 是基于堆栈的 这意味着大多数 C API
  • 如何以编程方式创建全屏TableLayout(表格高度意外折叠)

    下列TableLayout完全符合我的要求 它填充其父级并且列均匀拉伸
  • 如何在 github 存储库中执行状态检查

    我有一个 GitHub 存储库 在其中我使用以下新功能保护一个分支受保护的分支 https github com blog 2051 protected branches and required status checks 现在我的问题是
  • Bash 中“${!x}”间接扩展的安全注意事项

    假设我有一个变量 说x 包含未知的任意数据 以下间接扩展是否存在代码注入或其他形式的漏洞利用的风险 ARBITRARY COMMAND x 我知道有些情况下x分配给有用的现实生活场景本身可能会带来风险 需要适当控制或清理 但我在这里假设x已
  • 在 Woocommerce 订单和电子邮件中显示产品变体的自定义字段

    我成功地在 WooCommerce 后端添加了产品变体的自定义字段 并能够显示其值 我也想在订单和电子邮件中包含此值 Display Fields in admin on product edit screen add action woo
  • Flash AS3 中的文本链接

    因此 我自己为一些通过 Dropbox 工作的朋友制作了一个 wiki 式的应用程序 这意味着所有文件都存储在本地并由每个人更新 每个文件都是由 Flash 拉入的 txt 文件 然后使用简单的导航和搜索工具显示 现在我正尝试更进一步并链接
  • 在 Rmarkdown 中的每个部分中创建引用

    我想使用 Rmarkdown 但我读到的是 当使用 pandoc 创建参考书目时 引用位于文档末尾 pandoc citeproc 问题 多个参考书目 nocite citeonly https groups google com foru
  • 在 .NET 中处理和返回值

    考虑以下 TextReader reader new StreamReader file XmlSerializer xmlSerializer new XmlSerializer typeof T return T xmlSerializ
  • 更改自定义属性值

    我有一些代码 其中添加了我想要更改其值的自定义属性 div div 这是我正在尝试的 somebutton click function myCustomElement val SomeNewValue 但一切都没有改变 我怎样才能让它发挥
  • 从 Metafor 中的混合效应多级模型获取 R 平方

    我正在 R 中对森林的特定处理进行荟萃分析 对于这个模型 我需要拟合随机效应来解释研究方法的差异和地点年龄的变化之间的差异 因为这两个都是混杂变量 而且我对调查由它们引起的变化并不明确感兴趣 然而 据我所知 包裹 metfor 当您拥有多级
  • Git - 查找索引中单个文件的 SHA1

    我已将一个文件添加到 索引 git add myfile java 如何找到该文件的 SHA1 这是一个老问题 但有一件事需要澄清 这个问题和下面的答案讨论Git 哈希值一个文件的不完全一样 该文件的 SHA1 正如问题中所问 简而言之 如
  • Flex - 访问另一个 mxml 页面上的静态变量时出现问题

    首先 mxml 包含 Datefield 控件如下
  • Java字符串replaceAll()

    我一直想知道是否例如 JTextPane chatTextArea new JTextPane s replaceAll emoticon public String emoticon chatTextArea insertIcon new
  • Angular:ng-bind-html 过滤掉 ng-click?

    我有一些从 json 文件加载的 html 数据 我通过在我的应用程序中使用 ngSanitize 并使用 ng bind html 显示此 html 数据 现在我想将 json blob 中的任何链接从标准转换为 a href some
  • MySQL 列名称标准/约定 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在寻找包含 MySQL 列名称标准或约定的文档 建议 有人可以建议吗 据我所知 这个领域没有什么 标准 与 Sun 的旧 Java 约定不同
  • 在泛型中接受自身作为类型参数有什么用

    我在一个不相关的问题上看到了一些代码 但这让我很好奇 因为我从未见过 Java 泛型的这种构造 创建一个可以将其本身或其后代作为类型参数的泛型类有什么用处 这是示例 abstract class A