从多个接口继承的方法上的 List 返回类型中的 Java 泛型

2023-12-02

我目前在一家拥有多种模块的公司工作。在该公司中,如果您想提供模块内部结构,您可以通过 java 接口提供它,该接口隐藏实际的实现类型并为请求模块提供接口。现在我希望有一个提供程序能够为多个模块提供数据,这些模块公开实际内部数据的不同字段或方法。

因此,我有一个内部对象,其中有一些数据,并且每个模块都有一个接口,需要访问一些但不是严格所有字段。最后,我有一个外部对象,它实现所有这些接口并保存内部对象的实例来委托方法调用:

public class InternalObject {
    public int getA() { return 0; }
    public int getB() { return 0; }
}

public interface ModuleXObject {
   int getA();
}

public interface ModuleYObject {
    int getA();
    int getB();
}

public class ExternalObject implements ModuleXObject, ModuleYObject {
    private InternalObject _internal;

    public int getA() { return _internal.getA(); }
    public int getB() { return _internal.getB(); }
}

现在一切都很好,但如果我想提供 - 比方说 - 存储库方法来查找为正确模块键入的所述对象的列表,我会遇到如何实现这一目标的问题。我希望有如下的东西:

public interface ModuleXObjectRepository {
    List<ModuleXObject> loadAllObjects();
}

public interface ModuleYObjectRepository {
    List<ModuleYObject> loadAllObjects();
}

public class ExternalObjectRepository implements ModuleXObjectRepository, ModuleYObjectRepository {
    public List<ExternalObject> loadAllObjects() {
        // ...
    }
}

这不会编译,表示返回类型不兼容。所以我的问题是,是否有可能实现类似的目标,如果,如何实现?


我应该指出,我尝试了一些不同的方法,为了完整性,我想将它们包括在内,并描绘它们的缺点(在我看来)。

方法一:

public interface ModuleXObjectRepository {
    List<? extends ModuleXObject> loadAllObjects();
}

public interface ModuleYObjectRepository {
    List<? extends ModuleYObject> loadAllObjects();
}

public class ExternalObjectRepository implements ModuleXObjectRepository, ModuleYObjectRepository {
    public List<ExternalObject> loadAllObjects() {
        // ...
    }
}

这种方法非常接近我想要的解决方案,但会产生如下代码:

List<? extends ModuleXObject> objects = repository.loadAllObjects();

因此,要求用户将“? extends”包含到与调用 loadAllObjects() 有关的每个列表声明中。

方法2:

public interface ModuleXObjectRepository {
    List<ModuleXObject> loadAllObjects();
}

public interface ModuleYObjectRepository {
    List<ModuleYObject> loadAllObjects();
}

public class ExternalObjectRepository implements ModuleXObjectRepository, ModuleYObjectRepository {
    public List loadAllObjects() {
        // ...
    }
}

在我看来,这种方法只是省略了ExternalObjectRepository 中的泛型,因此大大降低了类型安全性。另外我还没有测试这是否真的有效。


只是为了排练,是否有任何可能的方法来定义加载所有对象方法,使用户能够获取使用各自模块的对象键入的列表,而无需

  • 在用户代码中需要“? extends”
  • 降低存储库实现中的类型安全性
  • 使用类/接口级别泛型

允许将其键入为的挑战List<ModuleXObject>其他代码可能保存为List<ExternalObject>.

All ExternalObject实例是ModuleXObject但反之则不然。

考虑以下附加类:

public class MonkeyWrench implements ModuleXObject{
    //STUFF
}

MonkeyWrench实例不是ExternalObject但如果有人可以投出一个List<ExternalObject> to a List<ModuleXObject>可以添加MonkeyWrench此集合的实例,这会导致运行时类转换异常并破坏类型安全的风险。

其他代码可以很容易地具有:

for(ExternalObject externalObject:externalObjectRepository.loadAllObjects())

如果这些实例之一是MonkeyWrench例如,运行时类转换,这是泛型要避免的。

的含义? extends ModuleXObject是你可以从集合中读取任何对象作为ModuleXObject但您无法向集合添加任何内容,因为其他代码可能对集合有额外的约束,这些约束在编译时并不明显/不可用。

我建议在你的情况下使用? extends ModuleXObject因为它的语义似乎与你想要的一致,即拉出ModuleXObject实例,例如

ModuleXObjectRepository repo = //get repo however
for(ModuleXObject obj : repo.loadAllObjects()){
    //do stuff with obj
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从多个接口继承的方法上的 List 返回类型中的 Java 泛型 的相关文章

  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • iPhone GPS - 电池消耗速度极快

    我们正在开发一款需要大量使用 GPS 的应用程序 并且无法优化电池寿命 即使设备没有移动 也有电池电量明显耗尽根据代码 这是不应该发生的 这是代码 locationManager CLLocationManager alloc init l
  • ASP.NET MVC JSON 对象可以通过带有动态类型参数的参数传递给控制器​​吗?

    我的 javascript 中有代码 一个用于发布数据的 ajax ajax url Configurations GetSelectedPageTranslation type POST data inttype some val obj
  • Python:如何通过Python脚本执行jar文件

    我一直在寻找如何通过 python 执行 java jar 文件的答案 并在查看之后 从 Python 执行 jar 如何让我的 python 版本 2 5 脚本在文件夹内而不是从命令行运行 jar 文件 如何在不安装Python Egg文
  • 如何在 Solr 中突出显示包含 html 的字段中的查询术语

    我有一个正文字段 其中可能包含来自富文本编辑器的 html 文本 我希望能够从中返回突出显示的片段 但删除了 html 获取下面被索引的文本 p class something some text here with words and o
  • Magento:获取订单Id,监听事件checkout_onepage_controller_success_action

    当我看到这个事件的时候checkout onepage controller success action并且有效 但我无法获取新创建的订单的 ID 有人有什么想法吗 使用magento 1 4 1 0 Thanks 该事件的发送方式如下
  • 当集合使用不同的 X 坐标范围时,iOS 图表将不会绘制多个数据集

    当从多个数据集创建折线图时 折线图仅显示其中一个数据集 并且在缩放或平移图表时会崩溃致命错误 无法形成 upperBound 如果我从一个数据集创建折线图 它会按预期工作 仅当两个数据集具有完全不同的 X 值范围时 才会出现此问题 下面的代
  • iOS:给定一个圆导出点击点的角度

    我有一个 UIImageView 显示一个分为六个相等三角形的圆 对应于 区域 1 0 60 度之间 区域2 gt 60 120度之间 区域3 gt 120 180度之间 区域4 gt 180 240度之间 区域5 gt 240 300度之
  • 如何将值从react-native发送到android活动?

    我想将 rowId 从 React Native Listview 发送到我的 Android 活动中的方法之一 原因是我正在将 React 集成到现有的 Android 应用程序 所以暂时我想发送 rowID 进行进一步处理 对此有什么想
  • Visual Studio 未在解决方案资源管理器中显示提交的文件

    I have committed files in Visual Studio and pushed them to a repo on Github Now i pulled the repo but the committed file
  • 将 SQL 子查询转换为 In to Linq Lambda

    如何将以下 SQL 语句转换为 Lambda 表达式或 Linq 查询 以下查询获取每个问题的最新答案 或者换句话说 为每个问题提供最新的答案 这也将由实体框架执行 SELECT Answers FROM Answers Where Ans
  • git 除了子目录及其被忽略目录的文件

    我使用 git 来管理我的源 我在以下路径中有一些文件 Debug a dll Debug b exe Debug c png Debug Pic a png Debug Pic b bmp Debug Pic c dll 我想忽略这些文件
  • JavaScript 中的 + + 运算符

    当我有一个加号时 我会得到错误的答案 例如 var b 069 var total 0 total total b console log total total 069 然而 当我添加第二个加号时 方程看起来像这样 total total
  • ggplot轴标题中斜体和上标的表达

    我很抱歉问这个问题 但我似乎无法正确地将这个表达式包含在ylab or xlab ggplot2 对象的参数 需要读一下 2q 稀有 不过 2 需要加上上标 我摆弄过expression and paste 但这似乎是不可能的 任何帮助深表
  • IEnumerable 到 FileStreamResult 的流

    我有一个IEnumerable
  • 删除文件权限被拒绝

    我遇到了 Stack Overflow 上有很多条目的问题 但没有一个解决了我的问题 我有这段代码 它尝试删除文件夹中的每个 txt 但我在 DeleteFile 命令上不断收到权限被拒绝的错误 directory C TEST FOLDE
  • Moodle注册表编辑

    我使用的是moodle 2 8 1 我的疑问是关于 Moodle 注册表 我想添加一个确认密码字段 该字段与电子邮件 再次 字段相同 并删除电子邮件 再次 字段 而且它也没有显示电话号码 注册表单中的字段处于解锁状态时 如果要向注册表单添加
  • 接收POST时出现404错误

    我需要使用 php 将 json POST 从 android 发送到 Web 服务器 我尝试了很多代码但不起作用 现在我尝试使用 Postman 进行简单的 POST 无论是否发送数据 并且总是收到404错误 如果我使用 GET 发送数据
  • 为什么多个类选择器不能与removeClass一起使用

    如何在一个声明中使用多个类来完成这项工作 div class ddd back7 d div div class fff back7 f div div class ggg back7 g div ddd fff ggg removeCla
  • 返回重复字母最多的第一个单词

    这是 coderbyte 的 Easy Set 中的一个问题 很多人已经问过这个问题 但我真的很好奇我的特定解决方案出了什么问题 我知道这是一个非常愚蠢且低效的解决方案 原问题 让函数 LetterCountI str 接受传递的 str
  • 从多个接口继承的方法上的 List 返回类型中的 Java 泛型

    我目前在一家拥有多种模块的公司工作 在该公司中 如果您想提供模块内部结构 您可以通过 java 接口提供它 该接口隐藏实际的实现类型并为请求模块提供接口 现在我希望有一个提供程序能够为多个模块提供数据 这些模块公开实际内部数据的不同字段或方