【问题标题】:java.lang.IllegalAccessError when calling java from scala -- solutions/workarounds?java.lang.IllegalAccessError 从 scala 调用 java - 解决方案/解决方法?
【发布时间】:2012-05-24 13:19:17
【问题描述】:

我在 scala 项目中使用了一个 java 线性代数库 (ojalgo 32.0),我遇到了一个 奇怪的问题。我使用的每种 ojalgo 方法都可以正常工作(例如,矩阵 和逐元素乘法、逆矩阵和随机矩阵 代)除了两个看似简单的用于获取矩阵维度的方法。我从来没有 以前调用 java 库时遇到麻烦,我很好奇 这是怎么回事。这是java中的一些示例代码,可以正常工作:

public static void main(String[] arg) {
  MatrixFactory tmpFactory = PrimitiveMatrix.FACTORY;
  BasicMatrix wMat = tmpFactory.makeRandom(5,5,new Weibull(5.0, 2.0));
  System.out.println(wMat.getColDim());
}

对 scala 的简单翻译(使用版本 2.9.2):

object DataGen {
  def main(args:Array[String]):Unit = {
  val tmpFactory = PrimitiveMatrix.FACTORY
  val wMat = tmpFactory.makeRandom(5,5,new Weibull(5.0, 2.0))
  println(wMat.getColDim)
}

scala 代码抛出这个:

Exception in thread "main" java.lang.IllegalAccessError: tried to
access class org.ojalgo.access.Structure2D from class DataGen$
   at DataGen$.main(DataGen.scala:11)
   at DataGen.main(DataGen.scala)

第 11 行是

println(wMat.getColDim).

搜索此错误的其他情况表明 scala 中存在一些与访问错误有关的已知问题,但我仍然不确定问题的原因或最干净的解决方法可能是什么。

【问题讨论】:

    标签: java scala


    【解决方案1】:

    我不完全明白为什么它不起作用,但我用它玩了一下,发现 BasicMatrix 不可访问,因为我试图将 Matrix 明确地投射到它,因为那是 @ 987654322@ 已实施。然而它起作用了,当我将矩阵投射到PrimitiveMatrix

    scala> res1.asInstanceOf[PrimitiveMatrix].getColDim
    res9: Int = 5
    

    【讨论】:

    • 感谢您的解决方法!我希望我知道潜在的问题可能是什么,但这肯定回答了我的问题。
    【解决方案2】:

    我刚刚使用 Scala 2.10-M3 和 ojalgo 32.4 进行了测试,您的代码按预期工作,因此它看起来像早期版本的 scalac 中的错误(使用 2.9 编译会在 2.10 运行时出现错误,但使用 2.10 编译不会t 给出 2.9 运行时的错误)。

    这建议了一个简单的解决方法 - 升级 Scala 版本!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多