Scala:重写等于擦除的问题等于参数化类的函数

时间:2010-12-01 19:00:17

标签: scala manifest equals type-erasure

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

这是我的问题: 我创建了一个新的参数化类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
}

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

我不知道如何解决这个问题。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:5)

你无法解决它。欢迎来到与java顺利互操作的乐趣。从def equals(x: Any): Boolean改进等于的唯一方法是编写不同的方法。

我总是试图说服马丁,我们应该以不同的方式实现== desugaring,目标是“def decentEquals [T](x:T)(隐式等价:Equiv [T])”,默认含义和桥接除非你关心,否则让它无缝化的方法,但他认为相等测试不应该变慢。​​

答案 1 :(得分:4)

只是 @exmpmpore 的答案的附件;完全可以编写 null-safe 等于可能类型安全的方法。请查看Scalaz Identityand 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修饰符很好:否则你可能没有注意到代码没有按照你的想法做到!

答案 2 :(得分:-1)

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

会编译,但我不认为它能做你想要的。你试图看看类型参数是否匹配(我假设),但我不知道你是如何(或者如果)那样做的。 (编辑:阅读更多的文献,我认为你不能。出于显而易见的原因,你不能用清单意识的功能覆盖非清单意识功能。)