Scala - 模式匹配类型参数?

时间:2014-05-14 02:43:01

标签: scala generics pattern-matching

如果我想避免使用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,因此我的问题 - 这可以通过更简单的方式实现吗?

1 个答案:

答案 0 :(得分:1)

不,没有更简单的方法。 Manifest已被ClassTagTypeTag取代,但没有任何简单的方法可以获得所需的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