2013-04-16 40 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