在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

是什么让您认为它不起作用?