Clojure给反射警告depsite类型提示

我正在编写一个聊天客户端/服务器,并拥有以下代码,它接受一个套接字,并返回一个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:UsersslomiIdeaProjectschatsrcchatmain.clj:44:5 - call to method write on java.io.PrintWriter can't be resolved (argument types: unknown).

我不知道如何让它更清晰。 双方p-outmessage明确暗示。 奇怪的是,调用flush很好。

我该如何解决这个问题?


问题是, go实际上重写你的代码到一个状态机(您可以检查与改造macroexpand-1但结果是相当漫长的,所以我在这里没有包括它)。 不幸的是,它看起来像这个转换不保留类型提示。

也许有一个更好的解决方案,但如果你拔出呼叫到它自己的功能,可以typehint,由于它不会被改写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))
链接地址: http://www.djcxy.com/p/82581.html

上一篇: Clojure giving reflection warnings depsite type hints

下一篇: How to parse nested parameters in a Clojure defn?