【问题标题】:Scala: Problems with erasure on overriding equals function for parametrized classesScala:参数化类的覆盖等于函数的擦除问题
【发布时间】:2010-12-01 19:00:17
【问题描述】:

我很难理解如何使用清单。

这是我的问题: 我创建了一个新的参数化类 C 并尝试像这样覆盖等于:

override def equals(that:Any)=that match{
 case that:C[T] => true /*do smth else not relevant*/
 case _ => false
}

当然,我收到“警告:类型模式 C[T] 中的非变量类型参数 T 未选中,因为它已被擦除消除”。我尝试使用清单,就像我在许多其他功能中使用的一样:

override def equals(that:Any)(implicit manifest:Manifest[T])=that match{
 case that:C[T] => true
 case _ => false
}

但我收到“错误:方法等于不覆盖任何内容”消息。

我不知道如何解决这个问题。谁能帮帮我?

【问题讨论】:

    标签: scala manifest equals type-erasure


    【解决方案1】:

    你无法修复它。欢迎享受与 java 顺畅互操作的乐趣。从 def equals(x: Any): Boolean 改进 equals 的唯一方法是编写不同的方法。

    我总是试图说服 martin 我们应该以不同的方式实现 == 去糖,目标是像 "defdecentEquals[T](x: T)(implicit equiv: Equiv[T])" 之类的东西,带有默认的隐式和桥接除非您在意,否则可以通过方法使其无缝,但他认为平等测试不应该变得更慢。

    【讨论】:

    • 谢谢。我不太关心java,所以很高兴没有所有这些问题。我习惯使用 Lisp 和 Haskell,所以我无法理解为什么 Scala 如此冗长。
    • 是的,可惜等价关系在 scala 中是不可插入的。我不同意马丁的观点;大多数人不关心性能(或者至少他们不应该)到这种程度
    【解决方案2】:

    只是 @extempore 答案的补充;完全可以编写 null-safe equals 方法,这些方法可能是类型安全的。看看Scalaz Identity(and examples)

    new Fruit ≠ new Orange //does not compile
    new Apple ≟ new Apple  //compiles!
    

    基于类型,它需要任何参数化也相等(即C[T] == C[U] iff T =:= U


    当然,尝试覆盖方法的问题:

    def foo(bar : Bar) : Baz
    

    有了这个:

    def foo(bar : Bar) ( implicit bat : Bat) : Baz
    

    这不构成覆盖。因为该方法具有不同的签名,所以您已重载该方法。这就是为什么 scala 需要 override 修饰符很好的原因:否则你可能没有注意到代码没有按照你的想法做!

    【讨论】:

    • [T] == C[U] iff C =:= U 不应该是 T =:= U 吗?
    【解决方案3】:
      override def equals(that:Any)= {
        that match{            
          case that:C[x] => true
          case _ => false                                     
        }
      }
    

    会编译,但我不认为它符合您的要求。您正在尝试查看类型参数是否匹配(我假设),但我不知道您如何(或是否)可以做到这一点。 (编辑:阅读更多文献,我认为你不能。由于显而易见的原因,你不能用一个支持清单的函数覆盖一个不支持清单的函数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 2018-06-20
      • 1970-01-01
      相关资源
      最近更新 更多