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 重载方法解析用于 Longs

于 2013-04-16T18:49:11.653 回答