当前位置: 首页 > 知识库问答 >
问题:

类型参数上的Scala模式匹配

曾宏毅
2023-03-14

我想消除此示例代码中的类型擦除警告:

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

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

警告:(31,13)类型模式Seq[Int](Seq[Int]的底层)中的非变量类型参数Int未选中,因为它被擦除情况b消除:Seq[Int]=

在这种情况下,你有什么简单的解决方案来避免擦除吗?

到目前为止,我尝试了什么(根据这一点):

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

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

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

共有3个答案

艾修然
2023-03-14

我也有同样的问题,最后做了这样的事情(没发现更漂亮的):

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")
}
商棋
2023-03-14

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

将摆脱警告。但它不能解决根本的擦除问题。Seq(“1”) 将匹配此情况。

蒋阳华
2023-03-14

我不确定这是一个最简单的解决方案,但我认为最好将类型与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)
 类似资料:
  • 我有一个从提取的代码,对于多个子类来说,这个代码看起来应该完全相同,所以我尽量避免重复。但是,实际上(见下文),scala认为是一个泛型的,返回的值类型为,当然,它没有和方法。 问题是在这里避免重复的适当方法是什么?我对将转换为字符串并不那么着迷,因为这段代码可以使用刚从字符串解析为AST的json。我开始考虑为我需要的三种类型编写包装器,并将这些类型的匹配和隐式转换器转换为包装器,然后为这些包装

  • 有四种不同的类型:地点、语言、技术和行业。每个类型都有一个存储库,可以返回这些类型的集合。例如位置列表。每个类型都有一个类型为String的name属性。有一个字符串列表。它可以包含位置、语言等名称。我想编写一个函数来查找那些与字符串列表名称匹配的类型实体(位置、语言、...)。我在想这样的事情: 这是不正确的,那么如何对集合进行查询,然后如何确定name属性是否存在呢?

  • 我有以下示例代码: 这段代码编译并在2.9. x上正确运行(输出“匹配:这是一个foo”,后面跟着“这是一个递归方法”),但它在2.10.2上不工作。相反,我得到了编译时错误:类型参数[_1美元]不符合trait Recurse的类型参数边界[T 有趣的是,问题只出现在模式匹配器中。如果我删除匹配块,代码将编译并输出“这是递归上的一个方法”。 更有趣的是,模式匹配仍然无法编译,即使其中只有默认情况

  • 本文向大家介绍Scala序列上的模式匹配,包括了Scala序列上的模式匹配的使用技巧和注意事项,需要的朋友参考一下 示例 检查集合中元素的准确数量 现场演示 提取first(s) element(s)并将其余部分保留为集合: 通常,可以用于构建序列的任何形式都可以用于与现有序列进行模式匹配。 请注意,在使用Nil和::在对序列进行模式匹配时将起作用,但确实会将其转换为List,并且可能会产生意外结

  • 主要内容:实例,实例,使用样例类,实例Scala 提供了强大的模式匹配机制,应用也非常广泛。 一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。 以下是一个简单的整型值模式匹配实例: 实例 object Test {     def main (args : Array [String ] ) {       println (matchTes