如果我想避免使用isInstanceOf & asInstanceOf
组合,而是想使用模式匹配,是否有任何简单方法可以避免以下示例中的擦除问题?我研究了一些答案,但它们似乎都使用Manifest,结果代码看起来比不受欢迎的isInstanceOf & asInstanceOf
组合更复杂。
trait Comparable[A] extends Ordered[A] {
override def equals(that : Any) =
that match {
case that : A => compare(that) == 0
case _ => false
}
}
我在上面代码中的目标是创建一个特性,将==和!=的实现添加到有序比较器中。但是,我收到以下错误,因为A被删除:
warning: abstract type pattern A is unchecked since it is eliminated by erasure
case that : A => compare(that) == 0
注意:StackOverflow上有关于此问题的其他类似问题,但接受的答案似乎使用Manifest,因此我的问题 - 这可以通过更简单的方式实现吗?
答案 0 :(得分:1)
不,没有更简单的方法。 Manifest
已被ClassTag
和TypeTag
取代,但没有任何简单的方法可以获得所需的ClassTag
- 特征无法获取参数,{{1在equals
中没有声明采用隐式Any
,所以我们必须强制实现类提供它:
ClassTag
import scala.reflect.ClassTag
trait Comparable[A] extends Ordered[A] {
implicit def ct: ClassTag[A]
override def equals(that: Any) =
that match {
case that: A => compare(that) == 0
case _ => false
}
}
也无济于事,它仍然需要isInstanceOf
。