gpt4 book ai didi

scala - 我可以在Scala中对类型参数执行匹配以查看其是否实现了特征吗?

转载 作者:行者123 更新时间:2023-12-03 14:52:40 24 4
gpt4 key购买 nike

我想有一个返回特定类型的类的方法,但是我希望该方法的行为取决于类是否扩展特定特征,如下所示:

case class ClassA extends TraitA
case class ClassB extends TraitB
case class ClassC extends TraitA
...
def myfunc[T]():T = {
T match {
case TraitA => // return new T in a particular way
case TraitB => // ditto
}
}

这可能吗,还是我做错了方向?

谢谢

最佳答案

您不能直接比较类型,因为没有任何要比较的对象(在运行时,由于erasure)。您可以使用您的类(class)的表现形式:

trait TraitA { }
trait TraitB { }
class ClassA extends TraitA { }
class ClassB extends TraitB { }

def myFunc[T](clazz: Class[T]) = {
if (classOf[TraitA] isAssignableFrom clazz) println("A")
else if (classOf[TraitB] isAssignableFrom clazz) println("B")
else println("?")
}

scala> myFunc(classOf[ClassA])
A

scala> myFunc(classOf[String])
?

或者您可以在类的实例上进行模式匹配:
def myFunc2[T](t: T) = t match {
case _: TraitA => println("A")
case _: TraitB => println("B")
case _ => println("?")
}

scala> myFunc2(new ClassA)
A

scala> myFunc2(Some(5))
?

您还可以通过类 list 以语法上较少干扰的方式使用第一种方法:
def myFunc3[T](implicit mf: ClassManifest[T]) = {
val clazz = mf.erasure
if (classOf[TraitA] isAssignableFrom clazz) println("A")
else if (classOf[TraitB] isAssignableFrom clazz) println("B")
else println("?")
}

scala> myFunc3[ClassA]
A

scala> myFunc3[String]
?

如果if / else变得怪异,您还可以选择其他类型的调度:
object MyFunc {
val dispatch = Map(
classOf[TraitA] -> (() => println("A")),
classOf[TraitB] -> (() => println("B"))
)
val default = () => println("?")
def apply[T](implicit mf: ClassManifest[T]) =
dispatch.find(_._1 isAssignableFrom mf.erasure).map(_._2).getOrElse(default)()
}

scala> MyFunc[ClassA]
A

scala> MyFunc[String]
?

请注意,从中使用该通用代码的任何通用代码都必须具有可用的类 list (作为隐式参数或简写形式 [T: ClassManifest])。

关于scala - 我可以在Scala中对类型参数执行匹配以查看其是否实现了特征吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5485817/

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