繁体   English   中英

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

[英]Scala: Problems with erasure on overriding equals function for parametrized classes

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

这是我的问题:我创建了一个新的参数化类C并试图像这样重写equals:

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
}

但我收到了“错误:方法等于无所事事”的消息。

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

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

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

只是@extempore回答的附件; 完全有可能写出null-safe equals方法,这些方法可能是类型安全的。 看看Scalaz Identity和示例

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修饰符的原因:否则您可能没有注意到代码没有按照您的想法进行操作!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM