2024 State of Clojure Survey!分享您的想法。

欢迎!请参阅关于页面,了解更多关于该网站的信息。

0
Java Interop

目前正在使用与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请求...

...