我希望能够检查某个Scala类是否可以从某个Java类中赋值。如前所述,并不总是可以执行D.class.isAssignableFrom(A.class).
基本上我需要的是这样的东西:
def isAssignableFrom(scalaClass: Class[_], javaClass: Class[T]): boolean = {
// magic
}
我测试过:
def m[T: ru.TypeTag, S: ru.TypeTag](x: T, y: S): Boolean = {
val leftTag = ru.typeTag[T]
val rightTag = ru.typeTag[S]
leftTag.tpe <:< rightTag.tpe
}
如以上链接中所述。但它抱怨Java类没有TypeTag:
error: No TypeTag available for Class[T]
我还不太熟悉Scala,所以也许有一种非常简单的方法可以做到这一点?
我设法解决了这个问题:
def isAssignableFrom(scalaClass: Class[_], javaClass: Class[T]): Boolean = {
val javaClassType: ru.Type = getType(javaClass)
val scalaClassType: ru.Type = getType(scalaClass)
scalaClassType.<:<(javaClassType)
}
def getType[T](clazz: Class[T]): ru.Type = {
val runtimeMirror = ru.runtimeMirror(clazz.getClassLoader)
runtimeMirror.classSymbol(clazz).toType
}