我正在尝试与这个简单的 scala 代码进行互操作,但遇到了一些麻烦。
package indicators
class DoubleRingBuffer(val capacity:Int=1000) {
var elements = new Array[Double](capacity);
private var head=capacity-1
private var max=0
def size ():Int = {
return max+1
}
def add(obj:Double):Double = {
head-=1
if (head<0) head=capacity-1
return set(max+1,obj)
}
def set(i:Int,obj:Double):Double = {
System.out.println("HI")
if (i>=capacity || i<0)
throw new IndexOutOfBoundsException(i+" out of bounds")
if (i>=max) max=i
var index = (head+i)%capacity
var prev = elements(index)
elements(index)=obj
return prev
}
def get(i:Int=0):Double = {
System.out.println("size is "+size())
if (i>=size() || i<0)
throw new IndexOutOfBoundsException(i+" out of bounds")
var index = (head+i)%capacity
return elements(index)
}
}
在 Clojure 中,我这样做
(import 'indicators.DoubleRingBuffer)
(def b (DoubleRingBuffer. 100))
(pr (.size b)) ;;ERROR: No matching field found: size for class indicators.DoubleRingBuffer
(pr (.get b 33)) ;;returns 0: should throw an index out of bounds error!
(pr (.get b 100)) ;;throws index out of bounds error, as it should
此外,我没有在控制台上得到任何输出!使用 scala 测试此代码可以按预期工作。这是怎么回事,我该如何修复它以便 clojure 可以使用 scala 代码?
在 REPL 中尝试这些:
(class b)
可能会告诉你这是indicators.DoubleRingBuffer
.
(vec (.getDeclaredMethods (class b)))
会给你一个在你的类中声明的所有方法的向量,就像它是一个Java类一样,这样你就可以看到它们的签名。
现在,使用这些方法名称和参数来调用签名中所示的方法。
我有一种感觉,问题出在 Scala 处理方法参数默认值的过程中。 罢工>
编辑:正如OP在评论中所描述的那样,事实并非如此。
如果这不起作用,您可以尝试将 Scala 字节码反编译为 Java,以了解如何进行DoubleRingBuffer
类的样子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)