gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:50:25 25 4
gpt4 key购买 nike

假设我们有一个泛型类Container:

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

然后,我们希望将 ContainerDoubleContainerAny 进行模式匹配:

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] 中的非变量类型参数 String 未被选中,因为它已被删除而消除”。由于删除,在运行时无法区分不同类型的容器,并且第一个捕获将被匹配。因此,Container[Double] 类型的容器将与第一个 case 匹配,该 case 捕获 Container[String] 对象,因此 toUpperCase方法将在 Double 上调用,并且将抛出 java.lang.ClassCastException

如何匹配由特定类型参数化的Container

最佳答案

也许这会有所帮助

 def matchContainer[A: Manifest](c: Container[A]) = c match {
case c: Container[String] if manifest <:< manifest[String] => println(c.value.toUpperCase)
case c: Container[Double] if manifest <:< manifest[Double] => println(math.sqrt(c.value))
case c: Container[_] => println("other")
}

编辑:

正如 Impredicative 指出的那样,Manifest 已被弃用。相反,您可以执行以下操作:

import reflect.runtime.universe._
def matchContainer[A: TypeTag](c: Container[A]) = c match {
case c: Container[String] if typeOf[A] <:< typeOf[String] => println("string: " + c.value.toUpperCase)
case c: Container[Double] if typeOf[A] <:< typeOf[Double] => println("double" + math.sqrt(c.value))
case c: Container[_] => println("other")
}

关于scala - 如何在 Scala 中对泛型类型进行模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com