首页 > 解决方案 > 在scala中如何确定一个类对象是否实现了一个特征

问题描述

就像下面的代码一样。我isAssignableFrom在 Java 中找到但它不在 scala 中。

  trait A

  def isTraitA(c:Class[_]) = {
    // check if c implements A
    // something like 
    // classOf[A].isAssignableFrom(c) 
  }
  
  isTraitA(this.getClass)

标签: scalareflection

解决方案


正如评论所说,您可以使用 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

不同之处在于您必须从已知的位置一直TypeTag[B]为您的类型传递隐式(例如,每次将类型定义为参数时在类型参数之后添加)并且必须在某个时候知道它(所以你不能简单询问一个实例,当您只知道具有该类型规范名称的 a 时)。B: TypeTagTypeTagString


推荐阅读