加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:48:46 所属栏目:安全 来源:网络整理
导读:让我们假设我们有一个通用类Container: case class Container[+A](value: A) 然后我们想要模式匹配一??个容器与一个双和任何容器: val double = Container(3.3) var container: Container[Any] = double 为此,我们通常写: container match { case c: Con
让我们假设我们有一个通用类Container:

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("_")  
}

但是,编译器会给出两个警告,前两个情况各一个。例如,第一个警告说:“非变量类型参数字符串类型模式Container [String]未选中,因为它被删除”。由于擦除,在运行时间不可能区分不同种类的容器,并且第一catch将被匹配。因此,Container [Double]类型的容器将匹配第一种情况,它捕获Container [String]对象,因此toUpperCase方法将在Double上调用,并抛出java.lang.ClassCastException。

如何匹配由特定类型参数化的容器?

解决方法

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

container match {
  case Container(x: String) => println("string")
  case Container(x: Double) => println("double")
  case _ => println("w00t")
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读