请在2024年 Clojure 状态调查! 中分享您的看法。

欢迎!请查看关于页面以获取更多关于这如何工作的小信息。

0
Java Interop

目前正在使用类似于 dectype 的形式实现自定义的 java.util.Iterator

(deftype MyIterator []
  Iterator
  (hasNext [this]
    (my-custom-code))
  (next [this]
    (my-custom-code))
)

但我希望重写 Iterator 上的默认 forEachRemaining 方法

default void forEachRemaining(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    while (hasNext())
        action.accept(next());
}

... 来提供一个更高效/专业化的实现。也许我还想实现默认未实现的 remove

default void remove() {
    throw new UnsupportedOperationException("remove");
}

但 dectype 不允许重写方法。这是基本限制,还是还没有人做过(可能因为 Clojure 早在 Java 8 中的默认方法之前出现)?无论如何,作为一个致力于拥抱宿主的编程语言,这对于使用/集成 Java 接口非常有用。

2 答案

+1

选定
 
最佳答案

您实际尝试过这个方法吗?因为它现在对我来说似乎管用。

(deftype MyIterator []
  java.util.Iterator
  (hasNext [this] false)
  (next [this] 0)
  ;; try to override default method
  (remove [this] (println "boo")))

(.remove (MyIterator.))
;; boo
很抱歉,我想尝试这个功能时可能出了些差错,可能误解了出现的错误。谢谢!
+1

deftype 只允许实现接口而不扩展具体类型是有意为之的,但在接口上存在默认方法之前,这项工作已经 Exist,这确实看起来应该得到支持。我将在明天提交一个 jira 请求...

...