如何判断Scala具体化类型是否扩展了某个父类?

如何判断Scala具体化类型是否扩展了某个父类?,scala,types,Scala,Types,在Scala中,我通过Scala清单获取给定类的类型并存储它。我的问题是,接下来如何检查该类型以确定原始类是从一个父类还是另一个父类派生的 由于类型擦除,我似乎无法在t:Class[MyParentClass]上执行模式匹配,如下所示: trait Product trait PerishableProduct extends Product class Fridge extends Product class Banana extends PerishableProduct def get

在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
trait产品
特性易腐产品扩展产品
类别冰箱扩展产品
易腐产品类别
def getProductType[P true
大小写=>false
}
//^^警告:类型模式中的非变量类型参数易腐产品
//类[易腐产品]未选中,因为它已通过擦除消除

我还缺少另一个技巧吗?

好的老反射怎么样:

def isPerishable[P](implicit m: Manifest[P]): Boolean = 
  classOf[PerishableProduct].isAssignableFrom(m.erasure)

isPerishable[Fridge]   // false
isPerishable[Banana]   // true

好的老反思怎么样:

def isPerishable[P](implicit m: Manifest[P]): Boolean = 
  classOf[PerishableProduct].isAssignableFrom(m.erasure)

isPerishable[Fridge]   // false
isPerishable[Banana]   // true

问题在于处理类型擦除时需要清单。清单提供了一种使用执行此测试的简单方法问题在于处理类型擦除时需要清单。清单提供了一种使用执行此测试的简单方法类似的示例:

import org.apache.spark.sql.types.{FloatType, IntegerType, NumericType, StringType}

object test_subclass {
  def main(args: Array[String]) = {
    Seq(IntegerType, FloatType, StringType)
      .map(e => {
        e match {
          case _:NumericType => 1
          case _ => 0
        }
      })
      .foreach(println)
  }
}

输出:

1
1
0
一个类似的例子:

import org.apache.spark.sql.types.{FloatType, IntegerType, NumericType, StringType}

object test_subclass {
  def main(args: Array[String]) = {
    Seq(IntegerType, FloatType, StringType)
      .map(e => {
        e match {
          case _:NumericType => 1
          case _ => 0
        }
      })
      .foreach(println)
  }
}

输出:

1
1
0

非常感谢Neil-我没有遇到过
非常感谢Neil-我没有遇到过
哇谢谢Sciss-这非常有效。它甚至可以与带有类型参数的特征一起工作:
classOf[GroupedEversableProduct[\u]]。isAssignableFrom(bananasType)
Wow Thank Sciss-这非常有效。它甚至可以用于带有类型参数的特征:
classOf[groupedEversableProduct[\u]]。isAssignableFrom(bananasType)