在scala中如何确定一个class对象是否实现了一个特征
In scala how to determine whether a class object implements a trait
就是下面的代码。我在 Java 中找到了 isAssignableFrom
但它不在 scala 中。
trait A
def isTraitA(c:Class[_]) = {
// check if c implements A
// something like
// classOf[A].isAssignableFrom(c)
}
isTraitA(this.getClass)
正如评论所说,您可以使用 Java 反射,但这会将您与 JVM 联系起来。
如果你想使用 Scala 的反射,你可以这样做:
import scala.reflect.runtime.universe._
def isTraitA[B: TypeTag]: Boolean = typeOf[B] <:< typeOf[A]
然后您可以在 REPL 中尝试:
class C
class D extends A
isTraitA[C] // false
isTraitA[D] // true
不同之处在于,您必须从已知的地方一直为您的类型 B
传递隐式 TypeTag[B]
(例如,每次都在类型参数后添加 : TypeTag
类型被定义为参数)并且在某些时候必须知道它(因此当您只知道具有规范名称的 String
时,您不能简单地请求 TypeTag
的实例)。
你问题中的代码工作正常:
scala 2.13.4> trait A
trait A
scala 2.13.4> def isTraitA(c:Class[_]) = classOf[A].isAssignableFrom(c)
def isTraitA(c: Class[_]): Boolean
scala 2.13.4> isTraitA(classOf[A])
val res0: Boolean = true
scala 2.13.4> isTraitA(classOf[AnyRef])
val res1: Boolean = false
scala 2.13.4> isTraitA((new AnyRef with A).getClass)
val res2: Boolean = true
是什么让您认为它不起作用?
就是下面的代码。我在 Java 中找到了 isAssignableFrom
但它不在 scala 中。
trait A
def isTraitA(c:Class[_]) = {
// check if c implements A
// something like
// classOf[A].isAssignableFrom(c)
}
isTraitA(this.getClass)
正如评论所说,您可以使用 Java 反射,但这会将您与 JVM 联系起来。
如果你想使用 Scala 的反射,你可以这样做:
import scala.reflect.runtime.universe._
def isTraitA[B: TypeTag]: Boolean = typeOf[B] <:< typeOf[A]
然后您可以在 REPL 中尝试:
class C
class D extends A
isTraitA[C] // false
isTraitA[D] // true
不同之处在于,您必须从已知的地方一直为您的类型 B
传递隐式 TypeTag[B]
(例如,每次都在类型参数后添加 : TypeTag
类型被定义为参数)并且在某些时候必须知道它(因此当您只知道具有规范名称的 String
时,您不能简单地请求 TypeTag
的实例)。
你问题中的代码工作正常:
scala 2.13.4> trait A
trait A
scala 2.13.4> def isTraitA(c:Class[_]) = classOf[A].isAssignableFrom(c)
def isTraitA(c: Class[_]): Boolean
scala 2.13.4> isTraitA(classOf[A])
val res0: Boolean = true
scala 2.13.4> isTraitA(classOf[AnyRef])
val res1: Boolean = false
scala 2.13.4> isTraitA((new AnyRef with A).getClass)
val res2: Boolean = true
是什么让您认为它不起作用?