当我使用两个空列表的 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 generics type erasure: when and what happens?
其他运行时(例如 .NET)确实具有具体化类型,这意味着 List<Foo>
和List<Bar>
是两种不同的类型。两种方法各有利弊。
对于 JVM future 有类似的东西已经进行了一些讨论和工作。 JVM 语言峰会 (JVMLS) 上的一些演讲表明,John Rose 和其他人一直在考虑使用模板类和类型种类来尝试解决此问题。所以 List 就是类,但可能有 species
对于每个 List<Foo>
和List<Bar>
。但据我所知,如果它真的到来的话,还需要几年的时间。
关于java - DeepEquals.deepEquals(refObject, ref),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51628769/