在Scala中,我通过Scala清单抓取给定类的类型并存储它.我的问题是,如何检查该类型以查看原始类是来自一个父类还是另一个类?
t: Class[MyParentClass]由于类型擦除,我看起来无法执行模式匹配,如下所示:
trait Product
trait PerishableProduct extends Product
class Fridge extends Product
class Banana extends PerishableProduct
def getProductType[P <: Product](implicit manifestP: Manifest[P]): Class[P] =
manifestP.erasure.asInstanceOf[Class[P]]
val isPerishable = getProductType[Fridge] match {
case x: Class[PerishableProduct] => true
case _ => false
}
// ^^ warning: non variable type-argument PerishableProduct in type pattern
// Class[PerishableProduct] is unchecked since it is eliminated by erasure
Run Code Online (Sandbox Code Playgroud)
我还缺少另一种技巧吗?
0__*_*0__ 10
好旧的反思怎么样:
def isPerishable[P](implicit m: Manifest[P]): Boolean =
classOf[PerishableProduct].isAssignableFrom(m.erasure)
isPerishable[Fridge] // false
isPerishable[Banana] // true
Run Code Online (Sandbox Code Playgroud)
问题是你在处理类型擦除时需要清单.Manifest提供了一种使用<:<执行此测试的简便方法.
println( manifest[Fridge] <:< manifest[PerishableProduct] )
println( manifest[Banana] <:< manifest[PerishableProduct] )
Run Code Online (Sandbox Code Playgroud)
上面有直接类型引用,所以更新getProductType但是它将被使用.
def getProductType[P <: Product](implicit manifestP: Manifest[P]): Manifest[P] = manifestP
val isPerishable = getProductType[Fridge] <:< manifest[PerishableProduct]
println( isPerishable )
Run Code Online (Sandbox Code Playgroud)