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

欢迎!请参阅关于页面以了解更多该服务的工作方式。

0
Java互操作

目前正在使用类似于如下deftype表单实现自定义 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");
}

但deftype不允许覆写方法。这是基本限制,还是尚未实现(可能因为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仅支持实现接口而不扩展具体类型是有意为之,因为在接口存在默认方法之前就已经存在这项工作。这似乎应该被支持。我会在明天提交一个jira请求...

...