Java 反射返回 Scala 类的基类型

问题描述 投票:0回答:1

在下面的代码中,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 需要单独的解决方案)。

scala reflection jvm overriding
1个回答
0
投票

您可以在

中添加
filter(!_.isBridge)

classOf[SSubClass].getDeclaredMethods.filter(!_.isBridge).find(_.getName == "get").get

桥接法如何运作?

© www.soinside.com 2019 - 2024. All rights reserved.