两个类之间的递归java泛型

2024-02-28

这是一个类似于中提出的问题两个类之间可能递归的 Java 泛型 https://stackoverflow.com/questions/5929689/possibly-recursive-java-generics-between-two-classes。然而,就另一条线索中所述而言,一切正常。就我而言,不幸的是,我需要使用递归方法的附加类。

更具体地说:我想使用边和节点定义一个图类。然后,我想从使用道路和路口作为边和节点的图类派生街道图。此外,我想使用铁路和车站作为边和节点来导出公共交通图。最后,我想定义一个包含街道图或公共交通图的变量。这最后一步是我迄今为止无法实现的。言语就这么多了;现在让我们得到 Java 代码:

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> {
}

现在,到目前为止的定义。我想做的是这样的:

StreetGraph street = new StreetGraph();
PTGraph ptGraph = new PTGraph();
Graph g = street;
...
g = ptGraph;
...

然而,我想避免对原始类型等发出警告。所以明显的方法是:

Graph<Node, Edge> g = street;

然而,这是不可能的,因为 Edge 不是 Node 的 ET 的有效替代品(这对我来说是绝对清楚的)。我需要类似的东西:

Graph<NT = Node<ET>, ET = Edge<NT>> g;

这是(正如预期的)无效的 Java 代码。 有什么想法,如何在没有警告/错误和类型安全的情况下实现有效的 Java 代码?

任何帮助表示赞赏。

谢谢, 马蒂亚斯


正如保罗已经说过的,我认为通配符参数可能就是您正在寻找的。

假设你的Graph接口有这些方法

public interface Graph<NT extends Node<NT, ET>, ET extends Edge<NT, ET>> {
  public NT getNode();
  public ET getEdge();
}

和你的StreetGraph以这种方式实现它们

public class StreetGraph implements Graph<JunctionNode, RoadEdge> {

    public RoadEdge getEdge()
    {
        return edge;
    }

    public JunctionNode getNode()
    {
        return node;
    }

}

然后你可以很好地执行以下操作,所有类型安全且编译器友好:

    Graph<?, ?> g = new PTGraph();
    g = new StreetGraph();

    Node<?, ?> n = g.getNode();
    Edge<?, ?> e = g.getEdge();

然后致力于Node and Edge接口,与底层实现无关。

如果您需要额外的类型信息,例如如果您想访问 JunctionNode 和 RoadEdge 特有的方法,但不包含在 Node 和/或 Edge 接口中,那么您可以使用更具体的方法StreetGraph代替Graph<?, ?>:

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

两个类之间的递归java泛型 的相关文章

随机推荐

  • 将浮点异常转换为 C++ 异常

    是否可以在 x86 Linux 上将浮点异常 信号 转换为 C 异常 这是出于调试目的 因此不可移植性和不完善性是可以的 例如 如果不能 100 保证调用所有析构函数 如果您的 C 标准库实现支持 TR1 函数fetestexcept fe
  • 最终字段和线程安全

    为了线程安全 它应该是特意不可变的 java 类 final 的所有字段 包括超级字段 还是没有修饰符方法就足够了 假设我有一个带有非最终字段的 POJO 其中所有字段都是某个不可变类的类型 这个 POJO 有 getters setter
  • 安装下载的 .apk 文件时解析错误

    嗨 两周后我又开始了我的研究并与这个错误作斗争 解析错误 解析包时出现问题 我的实现范围是尝试从服务器更新我的应用程序 我在该服务器上有更新的 apk 文件 并使用服务通过我的应用程序下载它 现在我在舞台边缘 我可以从该服务器下载文件 我可
  • Android 媒体播放器在 ICS 上永远循环

    我想播放通知声音 但我的问题是声音永远循环 而它应该只响一次 我尝试过两种方法 notification sound Uri parse content media internal audio media 38 and mMediaPla
  • 如何使用 Jersey Rest Webservices 和 Java 解析 JSON 数组

    我从 iOS 客户端获取 Json 数组 并希望使用 Java jersey 和 Gson 在服务器端解析 Json 我正在从 iOS 发送 POST 方法中的 JSON 数组 我想使用 json 但坚持如何在 Java 类中保存 json
  • C++ 的链接迭代器

    Python 的 itertools 实现了chain http docs python org library itertools html itertools chain迭代器本质上连接了许多不同的迭代器以提供单个迭代器的所有内容 C
  • jQuery 等效选择器

    以下内容完全等价吗 你使用哪种习语 为什么 form1 edit field input form1 edit field find input edit field input form1 input form1 edit field 我
  • EF 4.1 Code First:类型中的每个属性名称必须是唯一的查找表关联错误

    这是我第一次尝试创建自己的 EF 模型 我发现自己在尝试使用 Code First 创建查找表关联时陷入困境 以便我可以访问 myProduct Category AltCategoryID 我已经设置了模型和映射 据我所知是正确的 但继续
  • 在R中寻找SIR模型参数的问题

    我正在尝试使用 R 中的 SIR 模型来模拟冠状病毒感染率 但是 如您所见 我的 beta 控制易感者和感染者之间的过渡 和 gamma 控制感染者和康复者之间的过渡 值不正确 beta gamma 1 0000000 0 8407238
  • 如果存在则不能批量工作

    我正在尝试创建一个 bat 文件来创建一个简单的文本文件 我的问题是 Windows XP 主文件夹是C Documents and Settings而 vista 及以上C Users 我正在运行这个 无论我为路径名输入什么 我总是得到i
  • Express 中跨子域的会话

    我正在使用 Express 中的 vhost 功能和 Node 来管理我的应用程序的多个子域 该应用程序使用相同的会话密钥和密钥 并且我相信我已经使用了正确的会话 cookie 设置 cookie path domain example c
  • 如何在 Azure AD B2C 中存储来自 IdentityServer 3 的声明或仅将其包含在 AAD B2C 颁发的令牌中

    我想知道是否可以将 oid 声明或基本上由 Identity Server 3 发出的任何其他声明传播到 AAD B2C 并使其成为 Azure AD B2C 发出的令牌的一部分 我们需要在客户端拥有一个原始 ID 而我们从 sub 和 o
  • 没有框架的javascript ajax请求

    有谁知道如何在不使用 jQuery 等 javascript 框架的情况下制作跨浏览器的 ajax 请求功能 The XMLHttpRequest对象实际上使用起来并不那么复杂 为了广泛兼容 您必须玩一些游戏来创建对象 但之后的简单操作就相
  • 如何在浏览器窗口调整大小时调整CSS中的梯形大小

    当我调整浏览器窗口大小时 我试图调整梯形形状的大小 我试图通过使用来做到这一点box resize但还是没用 是否可以通过使用定义 创建的梯形来做到这一点border黑客 还有什么其他方法可以使梯形能够在调整浏览器窗口大小时调整大小 div
  • Codeigniter - 提交后验证失败时重新填充表单

    我有一个表单 要求用户输入一些信息 如果他们未能填写必填字段 他们将被重新提交表格 页面顶部通知他们需要哪些字段 并且我启用了粘性表单 set value 这样他们的输入就不会丢失 我使用 flashdata 向用户显示消息 即 如果他们输
  • 从 listWidget 中删除选定的项目

    如何从列表中删除选定的项目QListWidget 我尝试编写以下代码 但它不起作用 QList
  • 使用 Moya 获取响应标头

    我在我的 swift 应用程序中使用 Moya 来处理网络请求 我能够使用 Moya Object Mapper 获取请求并映射结果 我之前使用过 alamofire 熟悉如何发布 获取请求和读取响应头 然而 我似乎不明白如何在 Moya
  • Ag-grid 捆绑包尺寸太大

    我正在使用 Angular 6 开发一个 Web 应用程序 我有一个 Ag grid 企业版 Ag grid 文档说 我们必须导入所有农业网格角 农业网格社区 and 农业电网企业与农网企业合作 编译后 主包总大小超过 1 5 MB 在那里
  • Firebase 函数问题以及 .add() 与 .doc().set() 之间的区别

    几周以来我遇到了以下问题 以前不是问题 1 添加 数据 const saveNewDoc functions https onCall data NewDocWrite context CallableContext gt return a
  • 两个类之间的递归java泛型

    这是一个类似于中提出的问题两个类之间可能递归的 Java 泛型 https stackoverflow com questions 5929689 possibly recursive java generics between two c