Scala:检查对象是否为Numeric

时间:2012-08-18 17:34:03

标签: scala numeric typeclass

模式匹配是否可以检测某些内容是否为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不是像IntDouble这样的超类型,它是一个类型类。我也无法执行def equals[N: Numeric](o: N)之类的操作,因为o必须Any才能符合equals的合同。

那么如何在不列出每个已知的Numeric类的情况下进行此操作(包括,我猜,用户定义的类我可能都不知道)?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

您是否使用DoubleWrapperDouble添加方法?那么它应该是透明类型,即你不应该保留实例,而是定义pimped方法来返回Double。这样你可以继续使用==定义的基元,它已经做了你想做的事情(6.0 == 6产生true)。


好的,如果没有,那怎么样

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

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

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