在下面的代码中,Java 反射看到的 Scala 类的
get
方法的类型是 SSuperClass
(在 Scala 2.13 和 Scala 3 中都是)。然而,当对 Java 类执行相同操作时,类型是 SubClass。为什么是这样?我可以使用 Java 反射获得更精确的类型吗?
public class SuperClass {
public SuperClass get() {return this;}
}
public class SubClass extends SuperClass{
@Override
public SubClass get() {return this;}
}
class SSuperClass {
def get = this
}
class SSubClass extends SSuperClass {
override def get: SSubClass = this
}
object Main {
def main(args: Array[String]): Unit = {
val getMethod = classOf[SubClass].getDeclaredMethods.find(_.getName == "get").get
val returnType = getMethod.getReturnType
println(returnType)
val getMethodS = classOf[SSubClass].getDeclaredMethods.find(_.getName == "get").get
val returnTypeS = getMethodS.getReturnType
println(returnTypeS)
}
}
我知道这可以使用 Scala 反射来解决,但这会带来新的麻烦(例如,Scala 2 和 Scala 3 需要单独的解决方案)。
您可以在
中添加
filter(!_.isBridge)
classOf[SSubClass].getDeclaredMethods.filter(!_.isBridge).find(_.getName == "get").get