2012-05-22 54 views
4

我正在爲scala項目使用java線性代數庫(ojalgo 32.0),並且遇到了 奇怪的問題。我使用的每個ojalgo方法都可以正常工作(例如,矩陣 和元素方式乘法,逆和隨機矩陣 世代),除了兩個看起來很簡單的方法用於獲取矩陣尺寸。我從來沒有任何調用java庫的任何 麻煩,我很好奇 發生了什麼事情。下面是一些示例代碼在Java中,工作正常:從scala調用java時java.lang.IllegalAccessError - solutions/workarounds?

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()); 
} 

簡單的翻譯到斯卡拉(使用版本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訪問錯誤問題,但我仍不確定問題的原因或最簡潔的解決方法。

回答

1

我不完全明白它爲什麼不起作用,但我玩了一下它,發現BasicMatrix無法訪問,因爲我試圖將Matrix明確地轉換爲它,因爲那是getColDim所在的位置實現。但是它的工作,當我鑄造矩陣來PrimitiveMatrix

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

感謝您的解決方法!我希望我知道潛在的問題可能是什麼,但這肯定會回答我的問題。 – Chris

1

我只是使用Scala 2.10-M3測試和ojalgo 32.4和你的代碼按預期工作,所以它看起來像在早期版本scalac的錯誤(編譯2.9版給出了2.10運行時的錯誤,但用2.10編譯並沒有給出2.9運行時的錯誤)。

這表明一個簡單的解決方法 - 升級Scala版本!