【发布时间】:2011-11-11 08:18:30
【问题描述】:
我正在尝试创建一个可以匹配任何类型(包括原语)的引用相等性的方法。如何最好地做到这一点?
eq 仅在 AnyRef 上定义。如果我们尝试
def refEquals[A <% AnyRef, B <% AnyRef](a: A, b: B) = a eq b
然后在运行refEquals(1,2) 时,我们发现Predef 中有隐式方法,包括int2IntegerConflict 来破坏此类转换。
我试过这个:
def refEquals(a: Any, b: Any) = a match {
case x: AnyRef => b match {
case y: AnyRef => x eq y
case _ => false
}
case x: Any => b match {
case y: AnyRef => false
case y: Any => x == y
}
}
但这不起作用(refEquals(1.0, 1.0) 给出false),原因由 Rex Kerr 给出:Strange pattern matching behaviour with AnyRef
那么我们如何实现这样的方法呢?
edit:应该说“引用类型的引用相等,或原始类型的值相等”。
编辑:这是使用 Rex 回答中的想法的方法,适用于需要此内容且不喜欢打字的任何人:
def refEquals(a: Any, b: Any) = a match {
case x: Boolean if b.isInstanceOf[Boolean] => x == b
case x: Byte if b.isInstanceOf[Byte] => x == b
case x: Short if b.isInstanceOf[Short] => x == b
case x: Char if b.isInstanceOf[Char] => x == b
case x: Int if b.isInstanceOf[Int] => x == b
case x: Float if b.isInstanceOf[Float] => x == b
case x: Double if b.isInstanceOf[Double] => x == b
case x: Long if b.isInstanceOf[Long] => x == b
case _ => a.asInstanceOf[AnyRef] eq b.asInstanceOf[AnyRef]
}
【问题讨论】: