您的问题的标题是类,但实际问题使用特征。您可以通过使用classes的运行时反射来做这样的事情。让我们创建一个方便的方法来获取reflect.runtime.universe.Type
一个对象:
import scala.reflect.runtime.universe._
def tpeOf[A](a: A)(implicit tt: TypeTag[A]): Type = tt.tpe
还有一些示例类:
class Foo
class Bar extends Foo
val x = new Foo
val y = new Bar
我们可以使用我们的tpeOf
方法来获得 的Type
,x
并将y
其与Type
使用TypeTag
获得的 进行比较typeOf
。这将产生您想要的结果。
scala> tpeOf(x) =:= typeOf[Foo]
res0: Boolean = true
scala> tpeOf(x) =:= typeOf[Bar]
res1: Boolean = false
scala> tpeOf(y) =:= typeOf[Foo]
res2: Boolean = false
scala> tpeOf(y) =:= typeOf[Bar]
res3: Boolean = true
但这不适用于特征,因为在您的示例y
中不是的实例,而是扩展bar
的匿名类的实例。所以使用这种方法总是会产生. bar
false
trait foo {}
trait bar extends foo {}
val x = new foo {}
val y = new bar {}
scala> tpeOf(x) =:= typeOf[bar]
res4: Boolean = false // As expected, `x` is not exactly `bar`