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
by
抱歉,我想我在尝试这个时可能做错了某件事情,可能误解了遇到的错误。谢谢!
+1
by

deftype 只允许实现接口而不是扩展具体类型是有意为之,但是这项工作早于接口上存在默认方法,这似乎应该是受支持的。我将在明天提出一个 jira 请求...

...