从scala调用java时的java.lang.IllegalAccessError - solutions / workarounds?

时间:2012-05-22 22:01:47

标签: java scala

我正在使用java线性代数库(ojalgo 32.0)进行scala项目,我遇到了一个 奇怪的问题。我使用的每种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中存在一些已知的访问错误问题,但我仍然不确定问题的原因或最简洁的解决方法。

2 个答案:

答案 0 :(得分:1)

我不完全理解为什么它不起作用,但是我玩了一下它发现,BasicMatrix无法访问,因为我试图明确地将Matrix转换为它,因为那是实施getColDim的地方。但是当我将矩阵转换为PrimitiveMatrix

时,它才有效
scala> res1.asInstanceOf[PrimitiveMatrix].getColDim
res9: Int = 5

答案 1 :(得分:1)

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

这表明一个简单的解决方法 - 升级Scala版本!