scala - 在scala中如何确定一个类对象是否实现了一个特征
问题描述
就像下面的代码一样。我isAssignableFrom
在 Java 中找到但它不在 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
不同之处在于您必须从已知的位置一直TypeTag[B]
为您的类型传递隐式(例如,每次将类型定义为参数时在类型参数之后添加)并且必须在某个时候知道它(所以你不能简单询问一个实例,当您只知道具有该类型规范名称的 a 时)。B
: TypeTag
TypeTag
String
推荐阅读
- javascript - continue 不在循环内,firebox 给出编译器错误,但 chrome 可以吗?
- react-native - 为什么我需要将 redux-persist 与 Asyncstorage 一起使用?
- razor - 如何设置
我有一个 MVC 应用程序,其徽标图像位于我的 Images 文件夹中。文件名始终是“egs_logo_small”,但它可以是 .png 或 .jpg 或 .gif 等...我想简单地设置我的
@
- angular - Angular Search 更好的方法
- ios - 从已部署的应用程序中删除 WatchKit 应用程序 - iOS WatchOS Swift
- r - ggpubr -> ggline plot:无法重现具有多个因素的示例
- c - 我不确定这有什么问题......我认为这与 char 变量有关
- python - Python 3.x ImportError:没有名为 configparser 的模块,但已安装模块
- python - 无法弄清楚 TypeError
- r - 按中位数排序的动态 ggplot 函数