如何在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") } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |