模式匹配是否可以检测某些内容是否为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
不是像Int
和Double
这样的超类型,它是一个类型类。我也无法执行def equals[N: Numeric](o: N)
之类的操作,因为o
必须Any
才能符合equals
的合同。
那么如何在不列出每个已知的Numeric
类的情况下进行此操作(包括,我猜,用户定义的类我可能都不知道)?
答案 0 :(得分:5)
原始问题无法解决,我的理由是:
要确定类型是否是类型类的实例(例如Numeric),我们需要隐式解析。隐式解析在编译时完成,但我们需要在运行时完成。目前这是不可能的,因为据我所知,Scala编译器不会在编译的类文件中留下所有必要的信息。要看到这一点,可以使用包含局部变量的方法编写测试类,该变量具有隐式修饰符。删除修改器时,编译输出不会改变。
答案 1 :(得分:0)
您是否使用DoubleWrapper
向Double
添加方法?那么它应该是透明类型,即你不应该保留实例,而是定义pimped方法来返回Double
。这样你可以继续使用==
定义的基元,它已经做了你想做的事情(6.0 == 6
产生true
)。
好的,如果没有,那怎么样
override def equals(o: Any): Boolean = o == value
如果你相应地构造其他包装器的equals
方法,你应该最终再次比较原始值。
另一个问题是,是否应为有状态包装器提供此类equals
方法。我不认为可变对象根据它们所持有的值之一应该是相等的 - 你最有可能遇到麻烦。