让我们假设我们有一个通用类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") }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。