【问题标题】:Scala pattern match on type parameter类型参数上的 Scala 模式匹配
【发布时间】:2016-05-12 22:18:26
【问题描述】:

我想去掉这个示例代码的类型擦除警告:

val a: Seq[Any] = Seq(1)
a match {
  case b: Seq[Int] => b.map(c => println(2 * c) )
  case _ => println("Not matched")
}

它编译和工作正常,但有一个警告:

警告:(31, 13) 类型模式中的非变量类型参数 Int Seq[Int](Seq[Int] 的底层)是未选中的,因为它是 通过擦除消除 案例b: Seq[Int] => b.map(c => println(2 * c) ) ^

您有什么简单的解决方案可以避免这种情况下的擦除吗?

到目前为止我尝试了什么(根据this):

val a: Seq[Any] = Seq(1)
a match {
  case b@Seq(_:Int) => b.map(c => println(2 * c) )
  case _ => println("Not matched")
}

但它不会编译,因为 c 现在是 Any 类型。

我相信这个问题有几种解决方案。我会接受最简单的。

【问题讨论】:

标签: scala pattern-matching type-erasure type-parameter generic-type-argument


【解决方案1】:

我不确定这是一个最简单的解决方案,但我认为最好将类型与TypeTags 匹配

def matchOnList[A: TypeTag](l: List[A]) = typeOf[A] match {
    case t if t =:= typeOf[Int] =>
      l.asInstanceOf[List[Int]].foreach(c => println(2 * c))
    case _ => println("Not matched")
  }

val a = List(1)

matchOnList(a)

【讨论】:

  • 是的,这个我已经在某个地方看到过,我不喜欢asInstanceOf的用法。
  • @mirelon 我也是 :) 但我不知道如何避免强制转换。
【解决方案2】:

这个

  case b: Seq[Int @unchecked] => b.map(c => println(2 * c))

将摆脱警告。但它不会解决潜在的擦除问题。 Seq("1") 将匹配这种情况。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,我最终做了这样的事情(没有发现更漂亮的东西):

    val a: Seq[Any] = Seq(1)
    a match {
      case b: Seq[_] => b.map(c =>
        c match {
          case s: Int => print(2 * s)
          case _ => print("Not matched")
        })
      case _ => print("Not matched")
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 2016-04-02
      • 2015-02-28
      • 1970-01-01
      • 2020-08-09
      • 2013-03-17
      • 2013-12-18
      • 2014-03-05
      • 1970-01-01
      相关资源
      最近更新 更多