java - DeepEquals.deepEquals(refObject, ref)
问题描述
当我使用两个空列表的 deepEquals 时,即使两个列表的类型不同,它也会返回 true。我知道列表只是在编译而不是运行时具有不同的类型。
但是有没有机会注释这个领域或熟悉的东西?
所以这就是我想要的:
List<Foo> fooList = []
List<Boo> booList = []
DeepEquals.deepEquals(fooList, booList) //I want it to return false, as the list differs on type
在运行时,列表显示为 ArrayList 而无需键入
解决方案
目前在 Java 或 Groovy 中没有解决方案。您正在看到 Java 类型擦除在起作用。在 Java 1.5 中将泛型添加到 Java 时,这是一个让事情以这种方式工作的决定。
基本上编译的类是List。List<Object>
每个字段都是该类型的一个实例,并且在运行时都有效。与参数类型相关的信息不再可用。可以在此处找到有关类型擦除的更完整解释:
Java 泛型类型擦除:何时发生以及发生了什么?
.NET 等其他运行时确实具有具体的类型、含义List<Foo>
,并且List<Bar>
是两种独立的类型。两种方法都有其优点和缺点。
已经有一些讨论和工作让 JVM 在未来有类似的东西。JVM 语言峰会 (JVMLS) 上的一些演讲表明,John Rose 和其他人一直在考虑模板类和类型种类来尝试解决这个问题。所以 List 将是类,但species
每个List<Foo>
and都可能有一个List<Bar>
。但是 AFAIK 是几年之后的事,如果它真的到来的话。
推荐阅读
- firebase - 在 Flutter 中创建搜索栏而不不必要地调用 Cloud Firestore 的正确方法是什么?
- macos - 数学 Mac 安装
- reactjs - 如何显示活动指示器,直到从firestore中获取所有数据并使用redux在react native中显示
- c# - 将 ASP.Net Core 3.0 Web 应用程序路由到子域和子文件夹
- javascript - 无法让 registerProtocolHandler 在本地主机上工作
- python - 为什么 re.sub() 函数返回一个空字符串?
- ios - Swift 中 SKShapeNode 的浮点问题
- angularjs - 如何使用 $sce angularJS 1.6 清理未找到的 img
- c# - Rotativa ActionAsPdf 背景图片
- android - 并发修改异常 Stitch MongoDB 登录