问题
Is it possible for a pattern match to detect if something is a Numeric
? I want to do the following:
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 ##
}
But of course this doesn't really work because Numeric
isn't the supertype of things like Int
and Double
, it's a typeclass. I also can't do something like def equals[N: Numeric](o: N)
because o
has to be Any
to fit the contract for equals
.
So how do I do it without listing out every known Numeric
class (including, I guess, user-defined classes I may not even know about)?
回答1:
The original problem is not solvable, and here is my reasoning why:
To find out whether a type is an instance of a typeclass (such as Numeric), we need implicit resolution. Implicit resolution is done at compile time, but we would need it to be done at runtime. That is currently not possible, because as far as I can tell, the Scala compiler does not leave all necessary information in the compiled class file. To see that, one can write a test class with a method that contains a local variable, that has the implicit modifier. The compilation output will not change when the modifier is removed.
回答2:
Are you using DoubleWrapper
to add methods to Double
? Then it should be a transparent type, i.e. you shouldn't be keeping instances, but rather define the pimped methods to return Double
instead. That way you can keep using ==
as defined for primitives, which already does what you want (6.0 == 6
yields true
).
Ok, so if not, how about
override def equals(o: Any): Boolean = o == value
If you construct equals
methods of other wrappers accordingly, you should end up comparing the primitive values again.
Another question is whether you should have such an equals
method for a stateful wrapper. I don't think mutable objects should be equal according to one of the values they hold—you will most likely run into trouble with that.
来源:https://stackoverflow.com/questions/12020753/scala-checking-if-an-object-is-numeric