【问题标题】:Cannot access a Java static method from Scala无法从 Scala 访问 Java 静态方法
【发布时间】:2013-12-19 18:33:06
【问题描述】:

我遇到了 Scala 和 Java 互操作性问题,Google 和 SO 似乎对此无济于事(我看到过类似的问题,但没有一个问题可以为我的案例提供有效的解决方案)。

我在 Java 中创建了一个 jar 文件(托管 here,如果您需要它来回答这个问题),其中包含一个带有静态方法的类。但是,我似乎无法从 Scala 访问这个静态方法。代码如下:

val graph1 = ...
val graph2 = ...
val union = DirectedGraph.merge(graph1, graph2)

该方法存在,我可以使用普通的 Java 代码访问它。事实上,以下工作

DirectedGraph<OWLClass> graph1 = ...;
DirectedGraph<OWLClass> graph2 = ...;
DirectedGraph<OWLClass> union = DirectedGraph.merge(graph1, graph2);

我检查过 java 和 scala 使用的 jar 文件是否相同。我还检查了javap 是否确实存在该方法。

有什么想法可以理解并可能解决这个问题吗?

【问题讨论】:

  • 它会抛出两个错误:error while loading DirectedGraph, class file 'fetchers.jar(pt/remoteowl/objects/DirectedGraph.class)' is broken (class scala.MatchError/class DirectedGraph (of class scala.reflect.internal.Symbols$ClassSymbol))value merge is not a member of object pt.remoteowl.objects.DirectedGraph
  • 了解您使用的确切 Scala 版本会很有帮助,因为“类文件 X 已损坏”在不同版本中有各种原因。
  • Scala 版本 2.10.1(OpenJDK 64 位服务器虚拟机,Java 1.7.0_25)
  • 你提供的jar不是自带的;如果我尝试在 Scala repl 中使用它,我会收到“警告:找不到类 pt.remoteowl.jar.Dependency - 继续使用存根”。你确定这不是根本原因吗?除非您提供所有需要的依赖项,否则我无法尝试在我自己的机器上重现此内容。
  • 问题确实是 .class 文件从 jar 中丢失。谢谢!

标签: java scala scala-java-interop


【解决方案1】:

最可能的原因(根据我的经验)是 Java 编译器将注解视为可选,因此,如果您的依赖项之一使用注解并且没有包含此注解的依赖项,则它可以毫无问题地编译。然而,Scala 编译器认为这是一个错误。您可能需要查看 DirectedGraph 源代码及其超类型。

【讨论】:

猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2012-06-29
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
相关资源
最近更新 更多