2014-09-18 102 views
2

我希望能夠檢查某個Scala類是否可以從某個Java類中分配。如here所述,並不總是可以執行D.class.isAssignableFrom(A.class)。如何檢查scala類是否可以從java類中分配

基本上我需要的是這樣的:

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 
} 

從上面的鏈接說明。但抱怨沒有一個TypeTag的Java類:

error: No TypeTag available for Class[T] 

我沒那麼熟悉斯卡拉又那麼也許有這樣做的非常簡單的方法?

回答

1

我設法解決這個問題是這樣的:

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 
} 
+0

你能給的一對在這裏工作類型的例子嗎?這爲scala.Int和java.lang.Integer提供了false – Marcin 2017-01-03 21:54:14

相關問題