変数に2つの型の可能性を指定する方法は?
(defn connect! [(or ^:String :^java.net.InetAddress) host ^:Integer port] ...)
ありがとう!
変数に2つの型の可能性を指定する方法は?
(defn connect! [(or ^:String :^java.net.InetAddress) host ^:Integer port] ...)
ありがとう!
Clojure は、パフォーマンスが重要なコード領域でのリフレクションをコンパイラが回避できるように、型ヒントの使用をサポートしています。通常、既知のパフォーマンスのボトルネックが発生するまでは、タイプ ヒントの使用を避ける必要があります。
型ヒントの目的は、コンパイラがリフレクションを回避できるようにすることです。型ヒント付きコードの自己文書化の側面は二次的なものです。次のように言うと:
(defn connect! [^String host])
host
コンパイラに伝えていることは、コンパイル時にすべての Java 相互運用メソッド呼び出しをString
クラスのメソッド呼び出しに解決することです。フォームが複数のクラスでヒントされることを許可すると、この目的が無効になります。コンパイラは、メソッド呼び出しをどのクラスとしてコンパイルするかを認識できません。たとえそれがあったとしても、オブジェクトは同時にString
と になることはできません。そのため、クラスに対してコンパイルされたメソッド呼び出しは、たまたま が渡された場合に で失敗することが保証され、その逆も同様です。InetAddress
String
ClassCastException
InetAddress
私が知る限り、唯一の方法は、自分でチェックを行い、let 内にヒントを追加することです。
(condp instance? host
String (let [^String s] (...))
InetAddress (let [^InetAddress a] (...)))