无法从Scala访问Java静态方法
我在Scala和Java的互操作性方面遇到了一个问题,Google和其他公司似乎对此毫无帮助(我见过类似的问题,但没有一个能为我的案例提供有效的解决方案) 我已经在Java中创建了一个jar文件(如果您需要它来回答这个问题,可以托管它),其中包含一个带有静态方法的类。然而,我似乎无法从Scala访问这个静态方法。代码如下:无法从Scala访问Java静态方法,java,scala,scala-java-interop,Java,Scala,Scala Java Interop,我在Scala和Java的互操作性方面遇到了一个问题,Google和其他公司似乎对此毫无帮助(我见过类似的问题,但没有一个能为我的案例提供有效的解决方案) 我已经在Java中创建了一个jar文件(如果您需要它来回答这个问题,可以托管它),其中包含一个带有静态方法的类。然而,我似乎无法从Scala访问这个静态方法。代码如下: val graph1=。。。 val graph2=。。。 val union=DirectedGraph.merge(图1、图2) 该方法存在,我可以使用普通Java代码
val graph1=。。。
val graph2=。。。
val union=DirectedGraph.merge(图1、图2)
该方法存在,我可以使用普通Java代码访问它。事实上,以下工作:
DirectedGraph图形1=。。。;
DirectedGraph graph2=。。。;
DirectedGraph union=DirectedGraph.merge(graph1,graph2);
我检查了java和scala使用的jar文件是否相同。我还用javap
检查了该方法是否确实存在
有没有办法理解并可能解决这个问题?根据我的经验,最可能的原因是Java编译器将注释视为可选的,因此,如果您的一个依赖项使用注释,并且没有包含此注释的依赖项,则它编译时不会出现问题。但是,Scala编译器认为这是一个错误。您可能需要查看
DirectedGraph
源代码及其超类型。它会引发两个错误:加载DirectedGraph时出错,类文件“fetchers.jar(pt/remoteowl/objects/DirectedGraph.class)”被破坏(类scala.MatchError/class DirectedGraph(类scala.reflect.internal.Symbols$ClassSymbol))
和值合并不是object pt.remoteowl.objects.DirectedGraph的成员,了解您使用的确切Scala版本会很有帮助,因为“类文件X被破坏”在不同版本中有各种原因。Scala版本2.10.1(OpenJDK 64位服务器VM,Java 1.7.025)您提供的罐子不是独立的;如果我尝试在Scala repl中使用它,我会得到“警告:找不到类pt.remoteowl.jar.Dependency-继续使用存根”。你确定那不是根本原因吗?除非您提供所需的所有依赖项,否则我无法在我自己的机器上复制它。问题确实是jar中缺少一个.class文件。非常感谢。这解释了为什么Java不会抱怨jar,而Scala会抱怨。谢谢这里是一个相关的问题和答案