【问题标题】:clojure/scala interop?clojure/scala 互操作?
【发布时间】:2010-12-19 13:16:45
【问题描述】:

我正在尝试与这个简单的 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 代码?

【问题讨论】:

    标签: java scala clojure


    【解决方案1】:

    在 REPL 中试试这些:

    (class b) 可能会告诉你它是indicators.DoubleRingBuffer

    (vec (.getDeclaredMethods (class b))) 会给你一个包含在你的类中声明的所有方法的向量,就好像它是一个 Java 类一样,所以你可以看到它们的签名。

    现在,使用这些方法名称和参数调用您在签名中看到的方法。

    我感觉问题在于 Scala 处理方法参数的默认值。

    编辑:正如评论中描述的 OP,它不是。

    如果这不起作用,您可以尝试将 Scala 字节码反编译为 Java,以了解 DoubleRingBuffer 类的外观。

    【讨论】:

    • 谢谢!反编译成功了——java代码是完美的,所以最后我的增量构建工具出现了一些奇怪的错误——重新启动并按预期工作!顺便说一句,我用了java.decompiler.free.fr,很棒的工具。
    • @josh:您也可以尝试scalac -print,它会打印出一个“脱糖”版本,它仍然是 Scala 语法,但与 Java 同构,即删除了所有高级 Scala 功能。此外,还有scalap,其工作方式类似于javap,即反编译.class 文件。
    猜你喜欢
    • 2012-08-09
    • 2023-04-07
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多