1

変数に2つの型の可能性を指定する方法は?

(defn connect! [(or ^:String :^java.net.InetAddress) host ^:Integer port] ...)

ありがとう!

4

2 に答える 2

3

Clojureのドキュメントから:

Clojure は、パフォーマンスが重要なコード領域でのリフレクションをコンパイラが回避できるように、型ヒントの使用をサポートしています。通常、既知のパフォーマンスのボトルネックが発生するまでは、タイプ ヒントの使用を避ける必要があります。

型ヒントの目的は、コンパイラがリフレクションを回避できるようにすることです。型ヒント付きコードの自己文書化の側面は二次的なものです。次のように言うと:

(defn connect! [^String host])

hostコンパイラに伝えていることは、コンパイル時にすべての Java 相互運用メソッド呼び出しをStringクラスのメソッド呼び出しに解決することです。フォームが複数のクラスでヒントされることを許可すると、この目的が無効になります。コンパイラは、メソッド呼び出しをどのクラスとしてコンパイルするかを認識できません。たとえそれがあったとしても、オブジェクトは同時にStringと になることはできません。そのため、クラスに対してコンパイルされたメソッド呼び出しは、たまたま が渡された場合に で失敗することが保証され、その逆も同様です。InetAddressStringClassCastExceptionInetAddress

于 2015-03-18T19:14:20.273 に答える
1

私が知る限り、唯一の方法は、自分でチェックを行い、let 内にヒントを追加することです。

(condp instance? host
  String (let [^String s] (...))
  InetAddress (let [^InetAddress a] (...)))
于 2015-03-18T19:14:50.017 に答える