gpt4 book ai didi

scala - 如何确定类型参数是否是 trait 的子类型?

转载 作者:行者123 更新时间:2023-12-03 13:51:54 25 4
gpt4 key购买 nike

假设我有以下类型

class Foo
trait Bar

有没有办法制作一个接受类型参数 T 并确定 T 是否为 Bar 的方法?例如,
def isBar[T <: Foo: Manifest] = 
classOf[Bar].isAssignableFrom(manifest[T].erasure)

可悲的是, isBar[Foo with Bar]false因为删除似乎会删除 mixins。

另外, manifest[Foo with Bar] <:< manifest[Bar]是假的

这可能吗?

我看了这个问题: How to tell if a Scala reified type extends a certain parent class?

但该答案不适用于混合特征,因为它们似乎已被删除,如上所示。

最佳答案

这可以通过 TypeTags 来实现(至少 2.10M7):

scala> class Foo; trait Bar
defined class Foo
defined trait Bar

scala> import reflect.runtime.universe._
import reflect.runtime.universe._

scala> def isBar[A <: Foo : TypeTag] = typeOf[A].baseClasses.contains(typeOf[Bar].typeSymbol)
isBar: [A <: Foo](implicit evidence$1: reflect.runtime.universe.TypeTag[A])Boolean

scala> isBar[Foo]
res43: Boolean = false

scala> isBar[Foo with Bar]
res44: Boolean = true

TypeTag 提供 Scala 类型的 1:1 转换,因为它们代表编译器知道的类型。因此它们比普通的旧 list 更强大:
scala> val fooBar = typeTag[Foo with Bar]
fooBar: reflect.runtime.universe.TypeTag[Foo with Bar] = TypeTag[Foo with Bar]

用方法 tpe我们可以完全访问 Scalas 的新反射:
scala> val tpe = fooBar.tpe // equivalent to typeOf[Foo with Bar]
tpe: reflect.runtime.universe.Type = Foo with Bar

scala> val tpe.<tab><tab> // lot of nice methods here
=:= asInstanceOf asSeenFrom baseClasses baseType contains declaration
declarations erasure exists find foreach isInstanceOf kind
map member members narrow normalize substituteSymbols substituteTypes
takesTypeArgs termSymbol toString typeConstructor typeSymbol widen

关于scala - 如何确定类型参数是否是 trait 的子类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127164/

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