Clojure 给出反射警告 depsite 类型提示
Clojure giving reflection warnings depsite type hints
我正在写一个聊天 client/server,并有以下代码获取一个套接字,并返回一个 clojure.core。async/channel 可用于写入插座更容易。
我的问题是,尽管有类型提示,我仍然收到反射警告,提示无法解析对 .write
的调用。
(ns chat.main
(:require [clojure.core.async :as a :refer [>! >!! <! <!! go thread chan]])
(:import [java.net Socket ServerSocket]
[java.io InputStream BufferedReader InputStreamReader OutputStream BufferedOutputStream PrintWriter]))
(set! *warn-on-reflection* true)
(defn new-output-chan [^Socket sock]
(let [^OutputStream out (.getOutputStream sock)
^PrintWriter p-out (PrintWriter. out)
out-chan (chan)]
(go
(while (.isConnected sock)
(let [^String message (<! out-chan)]
(.write p-out message) ; <---------- Here
(.flush p-out)))
(a/close! out-chan))
out-chan))
给出:
Reflection warning, C:\Users\slomi\IdeaProjects\chat\src\chat\main.clj:44:5 - call to method write on java.io.PrintWriter can't be resolved (argument types: unknown).
虽然我不知道怎样才能让它更清楚。 p-out
和 message
都被明确提示。奇怪的是,调用 flush
没问题。
我该如何解决这个问题?
问题是 go
实际上将您的代码重写为状态机(您可以使用 macroexpand-1
检查转换,但结果非常冗长,因此我没有在此处包含它).不幸的是,这个转换似乎没有保留类型提示。
也许有更好的解决方案,但如果您将调用提取到它自己的函数中,您可以输入提示,因为它不会被 go
:
重写
(defn new-output-chan [^Socket sock]
(let [^OutputStream out (.getOutputStream sock)
^PrintWriter p-out (PrintWriter. out)
out-chan (chan)
write #(.write p-out ^String %)]
(go
(while (.isConnected sock)
(let [message (<! out-chan)]
(write message)
(.flush p-out)))
(a/close! out-chan))
out-chan))
我正在写一个聊天 client/server,并有以下代码获取一个套接字,并返回一个 clojure.core。async/channel 可用于写入插座更容易。
我的问题是,尽管有类型提示,我仍然收到反射警告,提示无法解析对 .write
的调用。
(ns chat.main
(:require [clojure.core.async :as a :refer [>! >!! <! <!! go thread chan]])
(:import [java.net Socket ServerSocket]
[java.io InputStream BufferedReader InputStreamReader OutputStream BufferedOutputStream PrintWriter]))
(set! *warn-on-reflection* true)
(defn new-output-chan [^Socket sock]
(let [^OutputStream out (.getOutputStream sock)
^PrintWriter p-out (PrintWriter. out)
out-chan (chan)]
(go
(while (.isConnected sock)
(let [^String message (<! out-chan)]
(.write p-out message) ; <---------- Here
(.flush p-out)))
(a/close! out-chan))
out-chan))
给出:
Reflection warning, C:\Users\slomi\IdeaProjects\chat\src\chat\main.clj:44:5 - call to method write on java.io.PrintWriter can't be resolved (argument types: unknown).
虽然我不知道怎样才能让它更清楚。 p-out
和 message
都被明确提示。奇怪的是,调用 flush
没问题。
我该如何解决这个问题?
问题是 go
实际上将您的代码重写为状态机(您可以使用 macroexpand-1
检查转换,但结果非常冗长,因此我没有在此处包含它).不幸的是,这个转换似乎没有保留类型提示。
也许有更好的解决方案,但如果您将调用提取到它自己的函数中,您可以输入提示,因为它不会被 go
:
(defn new-output-chan [^Socket sock]
(let [^OutputStream out (.getOutputStream sock)
^PrintWriter p-out (PrintWriter. out)
out-chan (chan)
write #(.write p-out ^String %)]
(go
(while (.isConnected sock)
(let [message (<! out-chan)]
(write message)
(.flush p-out)))
(a/close! out-chan))
out-chan))