代码之家  ›  专栏  ›  技术社区  ›  Dasma

DeepEquals.DeepEquals(重新对象,引用)

  •  0
  • Dasma  · 技术社区  · 6 年前

    当我使用两个空列表的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而不键入

    1 回复  |  直到 6 年前
        1
  •  1
  •   Steve Sowerby    6 年前

    目前在Java或Groovy中还没有解决这个问题的方法。 您在工作中看到了Java类型擦除。当泛型被Java1.5添加回Java时,这是一个决定。

    基本上编译的类是List。 每个字段都是该类型的一个实例,实际上都是 List<Object> 在运行时。 参数类型的相关信息不再可用。 关于类型擦除的更全面的解释可以在这里找到: Java generics type erasure: when and what happens?

    其他运行时(如.NET)具有具体化类型,这意味着 List<Foo> List<Bar> 是两种不同的类型。这两种方法各有利弊。

    已经有一些讨论和工作让JVM在将来有类似的东西。JVM语言峰会(JVML)上的一些谈话表明,JohnRose和其他人一直在考虑模板类和类型种类来尝试解决这个问题。所以名单是班级的,但可能有 species 对于每个 列表<Foo> 列表<栏> . 但如果它真的来了的话,那还有好几年。