【问题标题】:Scala - pattern match against a type parameter?Scala - 与类型参数的模式匹配?
【发布时间】:2014-07-01 22:15:49
【问题描述】:

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

【问题讨论】:

    标签: scala generics pattern-matching


    【解决方案1】:

    不,没有更简单的方法。 Manifest 已被 ClassTagTypeTag 取代,但没有任何简单的方法来获得所需的 ClassTag - 特征不能带参数,并且 Any 中的 equals 未声明取一个隐含的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 也无济于事,它仍然需要ClassTag

    【讨论】:

    • “Any 中的等于被声明为采用隐式 ClassTag”是什么意思?它只需要一个Any
    猜你喜欢
    • 2016-05-12
    • 2015-02-28
    • 1970-01-01
    • 2016-04-02
    • 2020-08-09
    • 2013-03-17
    • 2013-12-18
    • 2014-03-05
    • 1970-01-01
    相关资源
    最近更新 更多