Scala/Java:什么会导致构造函数采用与 .class 文件中定义的参数类型不同的参数类型?

问题描述

我正在使用 Scala REPL(实际上是 spark-shell)来测试一个想法。我正在使用由“maven-shade-plugin”创建的程序集 jar 来提供我需要测试的所有依赖项。在我的环境中启动 spark-shell 还会向类路径添加一些其他内容,这些内容应该由我的程序集 jar 遮蔽。其中之一是org.apache.thrift。因此,为清楚起见,当 spark-shell 以 spark-shell --jars './my.jar' 启动时,我可以访问:

org.apache.thrift

com.my.example.shaded.org.apache.thrift

我有一个定制的类,它的构造函数看起来像这样:

import org.apache.thrift.TFieldIdEnum
class MyClass(arg1: TFieldIdEnum) { /* class code here */}

这个类被打包,编译后的 .class 文件如下所示:

import com.my.example.shaded.org.apache.thrift.TFieldIdEnum
class MyClass(arg1: TFieldIdEnum) { /* class code here */}

我确认我使用的文件与 JD-GUI 看起来像这样。

当我尝试实例化 MyClass 对象时,出现如下错误:

  (arg1: org.apache.thrift.TFieldIdEnum)com.my.example.MyClass
 cannot be applied to (com.my.example.shaded.org.apache.thrift.TFieldIdEnum)
       val ex = new MyClass(shadedTFieldIdEnumObj)

(请忽略该错误涉及重载方法,即来自实际类,我从中得到错误,该类具有相同类型的重载构造函数)

什么会导致 ClassLoader 或 REPL 忽略在我指定的 jar 中找到的 .class 文件中为构造函数定义的类型?

进一步澄清,MyClass 不在默认类路径中,我访问它的唯一方法是使用上面显示的 --jars 参数指定 jar。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)