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

如何在Scala中对泛型类型进行模式匹配?

尹欣怿
2023-03-14

假设我们有一个泛型类容器:

case class Container[+A](value: A)

然后,我们希望将容器任意容器进行模式匹配:

val double = Container(3.3)  
var container: Container[Any] = double
container match {  
  case c: Container[String] => println(c.value.toUpperCase)
  case c: Container[Double] => println(math.sqrt(c.value))  
  case _ => println("_")  
}

共有1个答案

胡沈义
2023-03-14

一般来说,Rarry的回答是正确的,但是对于您的情况,它可以简化,因为您的容器只包含泛型类型的单个值,所以您可以直接匹配该值的类型:

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

  • 定义以下结构: 和下面的函数(请注意,第二行是类型检查错误点,它也是一个短路结果的算法错误,但它还是出现了,我想知道为什么类型检查没有发现它) 我知道scala也有类型擦除的问题,但我很惊讶在这种情况下,在编译时却检测不到这一点?在本例中是,而显然属于类型? 听起来这里有一个很长的解释https://gist.github.com/jkpl/5279EE05CCA8CC1EC452FC26ACE5

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

  • 我想消除此示例代码中的类型擦除警告: 它编译和工作正常,但有一个警告: 警告:(31,13)类型模式Seq[Int](Seq[Int]的底层)中的非变量类型参数Int未选中,因为它被擦除情况b消除:Seq[Int]= 在这种情况下,你有什么简单的解决方案来避免擦除吗? 到目前为止,我尝试了什么(根据这一点): 但是它不能编译,因为c现在是Any类型。 我相信这个问题有几种解决方法。我会接受最简单的

  • 我试图在Scala中返回抽象泛型类的子类,但它无法编译。我得到A类型的表达式不符合预期的B类型。这是我使用的代码: 创建()的签名应该是什么? 谢谢