首页 > 解决方案 > 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 而无需键入

标签: javagrailsgroovy

解决方案


目前在 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 是几年之后的事,如果它真的到来的话。


推荐阅读