14

模式匹配是否可以检测某物是否为Numeric? 我想做以下事情:

class DoubleWrapper(value: Double) {
  override def equals(o: Any): Boolean = o match {
    case o: Numeric => value == o.toDouble
    case _ => false
  }
  override def hashCode(): Int = value ##
}

但当然这并没有真正起作用,因为它不是和之类Numeric的东西的超类型,它是一个类型类。我也不能做类似的事情,因为必须符合合同。IntDoubledef equals[N: Numeric](o: N)oAnyequals

那么如何在不列出每个已知Numeric类的情况下做到这一点(包括,我猜,我什至可能不知道的用户定义的类)?

4

2 回答 2

5

原始问题无法解决,这是我的理由:

要确定一个类型是否是类型类的实例(例如 Numeric),我们需要隐式解析。隐式解析在编译时完成,但我们需要在运行时完成。目前这是不可能的,因为据我所知,Scala 编译器不会在编译的类文件中留下所有必要的信息。要看到这一点,可以编写一个测试类,其中包含一个包含局部变量的方法,该变量具有隐式修饰符。移除修饰符后编译输出不会改变。

于 2012-08-19T07:34:50.903 回答
0

您是否使用DoubleWrapper添加方法Double?那么它应该是一个透明类型,即您不应该保留实例,而是定义要返回的 pimped 方法Double。这样你就可以继续使用==为原语定义的东西,它已经做了你想要的( 6.0 == 6yield true)。


好的,如果没有,如何

override def equals(o: Any): Boolean = o == value

如果您相应地构造equals其他包装器的方法,您最终应该再次比较原始值。

另一个问题是您是否应该为有状态包装器提供这样的equals方法。我不认为可变对象根据它们所持有的值之一应该是相等的——你很可能会遇到麻烦。

于 2012-08-18T19:57:03.257 回答