3
public class Hello {
  public static void test(int i) {
    System.out.println("int");
  }

  public static void test(long l) {
    System.out.println("long");
  }
}


user=> (def foo 1)
#'user/foo

user=> (type foo)
java.lang.Long

user=> (Hello/test 1)
long
nil

user=> (Hello/test foo)
int
nil

user=> (Integer. 1)
1

user=> (Integer. foo)
1

user=> (Short. 1)
IllegalArgumentException No matching ctor found for class java.lang.Short  clojure.lang.Reflector.invokeConstructor (Reflector.java:183)

ルールを理解できませんでした。

4

1 に答える 1

1

つまり、Clojure には Java と同じオーバーロード動作がありません。これは、独自のルール セットを持つ (JVM 上で実行される) 別の言語です。したがって、メソッドを定義するtest(short s)と、特定の一致するメソッド シグネチャがあるため機能しますが、それ以外の場合、Clojure コンパイラは「最も近い」メソッドへの拡大変換を行いません。

リンクに関するより完全な議論については、この質問に対する私の回答を参照してください: Clojure overloaded method resolution for Longs

于 2013-04-16T18:49:11.653 に答える