如何使用泛型实现类型安全?

2023-12-11

我有课

public class ReportItem<ReportType extends Report>{ }

和班级

public abstract class Report implements Iterable<ReportItem>{

    private List<ReportItem<? extends Report> > itemList;

    public void add(ReportItem<? extends Report> item){
        itemList.add(item);
    }

    //Some other staff

}

public class ConcreteReport extends Report{ 
    //Some staff
}

问题在于方法add(ReportItem<? extends Report>)我可以提供的项目不与当前报告绑定,但与另一个报告绑定,并且编译器不会抱怨,这是不安全的。

方法可以写吗add以类型安全的方式,即我们只能作为参数传递ReportItem<T>其中 T 是当前报告的类型。


我认为您正在寻找以下内容。

public abstract class Report<T extends Report<T>> implements Iterable<ReportItem<T>>{

    private List<ReportItem<T>> itemList;

    public void add(ReportItem<T> item){
        itemList.add(item);
    }

    //Some other stuff

}

public class ConcreteReport extends Report<ConcreteReport> { 
    //Some stuff
}

它的工作原理是:

  • 你想要参数化ReportItem<T>与延伸自的东西Report
  • 您想要确保该列表ReportItem<T>都属于同一类型Report

为了绑定T的参数ReportItem<T>延伸到从Report,你需要参数化Report itself:

public abstract class Report<T> implements Iterable<ReportItem<T>>

您添加它需要从 Report 扩展的绑定

public abstract class Report<T extends Report> implements Iterable<ReportItem<T>>

但是您正在指定的界限原始报告类型,这不起作用,所以你需要提供Report与报告接收的类型参数,即T.

public abstract class Report<T extends Report<T>> implements Iterable<ReportItem<T>>

这样你就可以参数化List<ReportItem<T>>使用您扩展的具体类型:

public class ConcreteReport extends Report<ConcreteReport> { 

这样列表将是

public List<ReportItem<ConcreteReport>> itemlist;

这就是你想要的。

它有效! :) 我只是希望我的解释有意义。

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

如何使用泛型实现类型安全? 的相关文章

随机推荐

  • Angular 4.3.4 破坏了 mdInput 和 md-input-container

    我的团队最近从 4 3 0 升级到 Angular 4 3 3 在这些更改之后 mdInput 和 md input container 不再正常工作 在您单击输入字段之前 动画将按照material angular io componen
  • 在 NHibernate / SQL Server 中自动截断字符串

    我在 SQL Server 2005 数据库中有一个 nvarchar 2000 列 并将其映射到 NHibernate 中 如下所示
  • XE5 Android TBitmap.LoadFromStream 在线程内失败

    我正在使用 Delphi XE5 创建一个简单的 Android 游戏 我有一些资源 PNG 和 Jpeg 我想在我的程序加载所有资源时显示加载屏幕 但我发现将 TBitmap LoadFromFile 或 TBitmap LoadFrom
  • Thymeleaf 表单使用 ArrayList 对象提交

    我编写了一个简单的程序 用于表单提交 并将数据 ArrayList 从表发送到控制器类 提交表单时 数据始终为空 不确定我在这里做错了什么 我几乎花了很多时间来确定问题 但运气不佳 控制器类 我在 Post 方法中总是得到 null pub
  • magento multistore子文件夹没有符号链接

    是否可以设置带有子文件夹 子目录的 magento 多重商店而无需创建符号链接 For example www mainstore www mainstore store1 www mainstore store2 www mainstor
  • Pandas:如何将年度数据相互叠加

    我有一系列按时间值 浮点数 索引的数据 我想获取该系列的块并将它们绘制在彼此之上 举例来说 假设我在 20 周的时间内大约每 10 分钟获取一次股票价格 并且我想通过绘制 20 条股票价格线来查看每周模式 所以我的 X 轴是一周 我有 20
  • Android中计算用户移动速度

    我需要计算用户移动的速度 所以我们需要两件事来计算速度 GPS and Accelerometer 但两者都有其局限性 1 GPS并非始终可用 虽然我始终获取用户的当前位置 但我从Network provider仅而不是来自GPS 2 Ac
  • 使用 magrittr 管道前向运算符传递参数两次

    这是一个让我烦恼的虚拟例子 在vanilla会议 library magrittr test gt is na 1 FALSE test gt nchar gt 3 1 TRUE test gt is na 1 FALSE test gt
  • 对一维数据使用什么聚类算法? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我有一个数组中的数字列表 每个元素的索引是 X 值是 Y 我如何对这些数据进行分
  • Adobe Air - 检查互联网连接

    我正在使用 Adob e Flash CS 5 构建 Air 应用程序 我需要检查互联网连接是否可用 我遇到了这个错误 1172 找不到air net 定义 1046 未找到类型或不是编译时常量 URLMonitor 这是我的代码 impo
  • MySQL:复合索引全文+btree?

    我想要一个查询 它对一个字段进行全文搜索 然后对不同的字段进行排序 想象一下搜索一些文本文档并按发布日期排序 该表大约有 17M 行 它们在日期上或多或少均匀分布 这将在 Web 应用程序请求 响应周期中使用 因此查询最多必须在 200 毫
  • 如何连接到部署到 OpenShift 的 IBM MQ?

    我有一个带有 IBM MQ 的容器 Docker 镜像ibmcom mq 9 2 2 0 r1 暴露两个端口 9443 管理 1414 应用程序 OpenShift 中所有必需的设置均已完成 Pod 服务 路由 有两条路线 每个港口一条 h
  • 什么是整数类型?

    我看到了 golang core 并发现了这个 func make t Type size IntegerType Type IntegerType 和 Type 是什么意思 可以是C 吗 您的函数声明来自builtin包裹 builtin
  • 如何在 Gradle/IntelliJ 中添加测试资源根

    使用 IntelliJ 14 和 Gradle 2 2 中的 idea 插件生成 IntelliJ 项目 我可以通过以下方式添加新的测试源根用于集成测试 idea module testSourceDirs file src integra
  • 如何从 iphone corebluetooth api 列出已配对的蓝牙设备

    我正在尝试列出配对的蓝牙设备 我知道我可以使用retrieveConnectedPeripherals 获取已连接设备的列表 所以我的问题是如何以编程方式从 iphone SDK 获取配对设备 提前感谢大家 Regards Bhaban 你
  • php simplexml_load_file 带有破折号 ( - )

    嗨 我正在努力从 php 中的 xml 文件获取数据 xml 文件在这里 http musicbrainz org ws 2 artist 8bfac288 ccc5 448d 9573 c33ea2aa5c30 inc release g
  • 在 ObjectAnimationUsingKeyFrames 中使用 TemplateBinding

    我尝试设置鼠标悬停在控件上时的背景颜色 我尝试通过视觉状态管理器来做到这一点 我能够运行以下代码
  • form.valid() 不应显示验证文本?

    With Jquery validate required fields are showing popup validation on fileds like below pic 我喜欢这个并且工作得很好 但我检查 form valid
  • 从服务器导入 LESS

    在我的 ASP NET MVC 应用程序中 我有一个返回 LESS 变量的操作 我想将这些变量导入到我的主 LESS 文件中 由于 DotLess 只会导入扩展名为 less 或 css 的文件 因此推荐的方法是什么 我发现最简单的解决方案
  • 如何使用泛型实现类型安全?

    我有课 public class ReportItem