2024年Clojure状态调查!分享您的想法。

欢迎!请参阅关于页面以了解更多关于该平台的信息。

+8
Clojure
已关闭

JDK中有许多不是FI的SAM类型 - 其中一些突出的是ExecutorThreadFactory等。扩大我们适应的范围将使我们更接近Java的支持,并扩大该支持的使用范围。

简单示例

;; Adapt Thread constructor method value to ThreadFactory (not FI)
;; Use the factory to get a Thread with a Runnable and start it
(let [^java.util.concurrent.ThreadFactory tf ^[Runnable] Thread/new]
  (.start 
    (.newThread tf #(println "hi"))))

Execution error (ClassCastException) at user/eval145 (REPL:1).

class user$eval145$invoke__Thread_new__149不能转换到类java.util.concurrent.ThreadFactory

Jira:https://clojure.atlassian.net/browse/CLJ-2856

备注如下:决定不这样做,至少不在1.12范围内通过隐式转换做此事
我问Brian Goetz Java中这样做的原因是什么,令我惊讶的是,他回答说

问题:允许在lambda和方法引用中使用所有SAM/SMI而不是仅标记为FunctionalInterface的原因是什么?我认为这也是人们对FunctionalInterface注解产生困惑的原因。至少对我来说,这似乎是为了防止以未经意间的方式使用未注解的接口,但它并没有这样做。人们可能会想,如果我仍然在lambda中使用它怎么办?

布莱恩·戈茨:现有的Java库充满了SAM接口。要求在声明位置启用意味着,在众多方面中,这些库在人们将其作为lambda目标使用之前必须进行更新。而且,没有任何合理的理由;这些都可以与单方法匿名类一起使用,不允许这里的lambda将仅仅是为了自我限制。至于“会多糟糕”,答案是“根本不会有多糟糕。”
...