问题
Clojure调用Java的可变参数方法需要为最后一个参数创建一个对象数组。这在进行交互时经常是一个混淆的来源。
例如,尝试调用java.util.Collections.addAll(Collection c, T... elements)
user=> (Collections/addAll [] (object-array 0)) false user=> (Collections/addAll []) IllegalArgumentException No matching method: addAll clojure.lang.Compiler$StaticMethodExpr.<init> (Compiler.java:1401)
Method类提供了一个{{isVarArg()}}方法,可以用来通知编译器以不同的方式处理。
来自http://groups.google.com/group/clojure/browse_thread/thread/7d0d6cb32656a621
最新补丁: 由于不完整且目标不明确而被删除
Java中的可变参数
根据目前所述,此问题跟踪的范围仅限于省略可变参数,但这只是Clojure处理可变参数与Java不同的情况之一。为了完整性,以下是关于Java如何处理可变参数方法的简要概述,希望它可以提供有关如何不同地处理Clojure的讨论,以及此问题跟踪的目标应该是什么。
给定以下配置
`
public class VarArgs {
public static class SingleVarargMethod {
public static void m(String arg1, String... args) {}
}
public static class MultipleVarargMethods {
public static void m(String... args) {}
public static void m(String arg1) {}
public static void m(String arg1, String... args) {}
}
}
`
|Java|可能Clojure等效? |注释|
| :-- | :-- | :-- | :-- |
|{{VarArgs.SingleVarargMethod.m("a");}} | {{(SingleVarargMethod/m "a")}} | |
|{{VarArgs.SingleVarargMethod.m("a", "b");}} | {{(SingleVarargMethod/m "a" "b")}} | |
|{{VarArgs.SingleVarargMethod.m("a", "b", "c");}} | {{(SingleVarargMethod/m "a" "b" "c")}} | |
|{{VarArgs.SingleVarargMethod.m("a", new String[]{"b", "c"});}} | {{(SingleVarargMethod/m "a" (object-array ["b" "c"]))}} | |
|{{VarArgs.MultipleVarargMethods.m();}} | {{(MultipleVarargMethods/m)}} | |
|{{VarArgs.MultipleVarargMethods.m((String) null);}} | {{(MultipleVarargMethods/m nil)}} |使用类型提示进行区分?|
|{{VarArgs.MultipleVarargMethods.m((String[]) null);}} | {{(MultipleVarargMethods/m nil)}} |使用类型提示进行区分? |
|{{VarArgs.MultipleVarargMethods.m("a", null);}} | {{(MultipleVarargMethods/m "a" nil)}} | |
|{{VarArgs.MultipleVarargMethods.m("a", new String[]{});}} | {{(MultipleVarargMethods/m "a" (object-array 0))}} | |
|{{VarArgs.MultipleVarargMethods.m(new String[]{"a"});}} | {{(MultipleVarargMethods/m (object-array ["a"]))}} | |
|{{VarArgs.MultipleVarargMethods.m("a", new String[]{"b", "c"});}} | {{(MultipleVarargMethods/m "a" (object-array ["b" "c"]))}} | |