更广泛的递归/泛型问题

2024-04-20

根据提出的问题和回答的问题here https://stackoverflow.com/questions/6650532/recursive-java-generics-between-two-classes,我有第二个,更复杂的一个(至少在我看来)。不过,为了使阅读(和回答)更容易,我将在此处重申完整的代码示例:

让我们首先定义一组类/接口:

public interface Node<NT extends Node<NT, ET>, ET extends Edge<NT, ET>> {
  /* internal datastructures here */
}

public interface Edge<NT extends Node<NT, ET>, ET extends Edge<NT, ET>> {
  /* internal datastructures here */
}

public interface Graph<NT extends Node<NT, ET>, ET extends Edge<NT, ET>> {
  /* internal datastructures here */
}

public class JunctionNode implements Node<JunctionNode, RoadEdge> {
}

public class RoadEdge implements Edge<JunctionNode, RoadEdge> {
}

public class StreetGraph implements Graph<JunctionNode, RoadEdge> {
}

public class PTNode implements Node<PTNode, PTEdge> {
}

public class PTEdge implements Edge<PTNode, PTEdge> {
}

public class PTGraph implements Graph<PTNode, PTEdge> {
}

我现在需要定义一个联运图,即包含 PTEdges 和 RoadEdges 的图。在我看来,我会通过声明来做到这一点

public class IntermodalGraph implements Graph<Node, Edge> {
}

这里编译器抱怨 Node 和 Edge,因为 Node 被定义为有两个类型参数,其中一个参数派生自第二种类型(此处为 Edge)。这意味着,我必须声明

public class IntermodalGraph implements Graph<Node<Node, Edge>, Edge> {
}

到目前为止,第一个类型参数 (Node) 没问题,但第二个类型参数 (Edge) 失败,因为 Edge 再次采用两个类型参数,第一个类型参数源自 Node。所以,我会写

public class IntermodalGraph implements Graph<Node<Node, Edge>, Edge<Node<Node, Edge>>, Edge> {
}

现在,第二个类型参数没问题,但第一个类型参数(显然)又“不好”了。

最后,我想实现一些类似的代码

IntermodalGraph ig = new IntermodalGraph();
ig.add(new PTEdge());
ig.add(new RoadEdge());

Set<Edge> edges = ig.getEdges();

那么有人知道如何在保持类型安全的同时实现这一目标吗?

lg, 马蒂亚斯


由于您的类已经指定了泛型,因此您可以声明您的IntermodalGraph类为

public class IntermodalGraph<NT extends Node<NT, ET>, ET extends Edge<NT, ET>> implements Graph<NT, ET> {
}

这不应该引发任何警告。

** EDIT **

你无法实现你想要的,那就是拥有

IntermodalGraph ig = new IntermodalGraph();
ig.add(new PTEdge());
ig.add(new RoadEdge());

Set<Edge> edges = ig.getEdges();

不扔任何unchecked警告,除非您添加@SuppressWarnings("unchecked")注释。但它is still有效的 Java 语法并且可以工作;通用的NT将默认为Node and ET to Edge

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

更广泛的递归/泛型问题 的相关文章

随机推荐

  • 创建 Java 泛型类时尖括号中的波形符意味着什么?

    我正在阅读一些 JMockit 示例并发现以下代码 final List
  • 同步访问双向链表

    我正在尝试在 pthreads 环境中用 C 实现一个 特殊类型的 双向链表 但仅使用 C 包装的同步指令 如原子 CAS 等 而不是 pthread 原语 列表的元素是固定大小的内存块 几乎肯定无法容纳pthread mutex t等等
  • 适用于不同屏幕尺寸和密度组合的可绘制文件夹

    可绘制文件夹有什么用 低密度 中屏 低密度 大屏幕 低密度 超大屏幕 中等密度 小屏幕 中密度 大屏幕 中等密度 超大屏幕 对于平板电脑 低密度 中屏 drawable ldpi 低密度 大屏幕 drawable large ldpi 低密
  • R 对对象列表进行排序

    我有一个对象 key value 对列表 例如 列表 预测 1 1 1 0000000 0 8564264 2 1 2 0000000 0 1980792 我想按每个元素的第二个组成部分降序排列此列表 意味着按 0 8564264 和 0
  • 如何在 JPA 查询中编写 MAX 和 OVER (PARTITION BY) 函数

    我需要根据另一列 绘图编号 获取一列 修订版 最大值 谁能告诉我此功能的 JPA 查询 我编写了以下查询 但该查询不起作用 请帮助我如何在 JPA 查询中编写 MAX 和 OVER PARTITION BY 函数 Query select
  • 为什么我的输入不适合 div?

    我写了这个html和css代码 HTML div div h1 Seek enjoy h1 h3 Your movie seeker h3 div div div div
  • 使用反射实例化不可变对象

    我创建了一个基类来帮助我减少 C 中不可变对象初始化的样板代码 我使用延迟初始化是为了尽量不影响性能 我想知道这样做对性能有多大影响 这是我的基类 public class ImmutableObject
  • HashLocation 策略有什么缺点吗?

    我目前正在学习 Angular 我已经使用 HashLocation 实现了路由器 因为 PathLocation 在 Apache 服务器中不起作用 我浏览了各种帖子来解决这个问题 但最终不得不选择 Apache 的 HashLocati
  • 实体框架代码优先 - 将两个字段合并为一个集合

    我有这个型号和配置 public class Person public int FatherId get set public virtual Person Father get set public int MotherId get s
  • 使用内联要求

    如果我使用内联要求 如下所示 function something paths return require path join paths something etc etc 每次调用时引擎都需要吗 例子 let i 10 while i
  • 使用频带刻度的相同可重复字符串值

    我是 D3 的新手 想绘制带有 6 个水平条的图表 我的 xAxis 与它们的值是scaleLinear 的 所以我希望 yAxis 只是一个包含每个条形名称的列表 所以对于 yScale 我有 6 个名称 Games Apps Games
  • 禁用 Odoo 中看板列视图上的拖动和排序功能

    我正在 Odoo 9 中制作看板视图 以在基于 Many2one 字段的列中显示我的模型 我创建了这样的看板视图
  • matplotlib散点图颜色作为第三个变量的函数[重复]

    这个问题在这里已经有答案了 我想知道如何通过第三个变量使 matplotlib 的散点函数颜色点 问题matplotlib 中的 gnuplot linecolor 变量 https stackoverflow com questions
  • build.gradle 文件中的 IntelliJ 运行配置

    我有一个 Gradle 项目 目前可以通过以下方式导入到 IntelliJ 中 build gradle文件 IntelliJ 将设置正确的源位置并为我引入依赖项 我想做的是列出 IntelliJ 运行配置 build gradle文件 以
  • UIViewController 通话中状态栏问题

    Issue 通话状态栏消失后 模态呈现的视图控制器不会向上移动 在顶部留下 20px 的空白 透明空间 正常 没有问题 通话中 没有问题 通话中消失后 在顶部留下 20 像素高的空白 透明空间 显示下面的橙色视图 但是状态栏仍然存在于透明区
  • “您确定要离开此页面吗?”取消和确定功能

    我正在尝试执行类似于您离开的某些网站的操作 它会显示一个弹出窗口 显示 您确定要离开此页面吗 并有两个选项 取消 和 确定 我该如何做到这一点 并做到当您单击 取消 时 它只会取消该框 当他们单击 确定 时 它会执行 leaveChat 功
  • 如何仅在非整数时显示小数点?

    我用谷歌搜索过 但找不到正确的答案 假设我们有浮点数并得到它们的平均值 他们的平均值是这样的 3 5 2 5 5 7 所以我们有 4 个数字 不再在列表中的人 两个带小数的数字和两个整数 我想做的是 打印这些数字并保持这样 但我的问题是 当
  • JQuery ajax调用默认超时值

    我收到了无法复制的错误报告 但 ajax 调用超时是当前最好的猜测 所以我试图找出 jQuery 超时的默认值 ajax 称呼 有人有主意吗 在 jQuery 文档中找不到它 似乎没有标准化的默认值 我感觉默认是0 超时事件完全取决于浏览器
  • 使用 Javascript 将日期设置为 raddatepicker

    我从服务器端获取日期值并将其传递给 javascript 方法 然后使用 Javascript 将日期分配给 Telerik RadDatePicker 控件 我得到的日期为 var Date1 16 01 2013 00 00 00 fu
  • 更广泛的递归/泛型问题

    根据提出的问题和回答的问题here https stackoverflow com questions 6650532 recursive java generics between two classes 我有第二个 更复杂的一个 至少在