2013-04-16 42 views
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) 

我找不出规则。整数类型转换如何在java互操作中工作?

回答

1

简而言之,Clojure没有与Java相同的重载行为。它是一种不同的语言(它运行在JVM上)具有自己的一套规则。因此,如果你定义了一个方法test(short s)它将会工作,因为你有一个特定的匹配方法签名,但Clojure编译器不会对“最接近”方法进行扩展转换。

对于一个带有链接的更完整的讨论,请参阅我的回答这个问题: Clojure overloaded method resolution for Longs

+0

为什么'(你好/测试富)'选择INT超载?为什么'(Short。1)'在'(Integer。1)'成功时失败?没有所有规则的官方文件?我应该阅读编译器的源代码吗? – alice

+0

阅读Rich Hickey的这篇文章,链接自我的其他答案:https://groups.google.com/forum/#!msg/clojure/7-hARL5c1lI/ntnnOweEGfUJ – noahlz

+0

关于文档:http://dev.clojure.org /display/doc/Documentation+for+1.3+Numerics - 请注意,行为可能取决于您的Clojure版本。 – noahlz