问题
Clojure 对 Java vararg 方法的调用需要为最后一个参数创建一个对象数组。这是在互操作过程中常见的一个混淆源头。
例如,尝试调用 java.util.Collections.addAll(Collection c, T... elements)
user=> (Collections/addAll [] (object-array 0)) false user=> (Collections/addAll []) IllegalArgumentException 无匹配方法:addAll clojure.lang.Compiler$StaticMethodExpr.<init> (Compiler.java:1401)
Method 类提供了一个 {{isVarArg()}} 方法,可以用来自动告知编译器以不同方式处理。
来源:http://groups.google.com/group/clojure/browse_thread/thread/7d0d6cb32656a621
最新补丁: 删除,因为不完整,目标不明确
Java 中的 Varargs
根据目前陈述,这个问题的范围仅限于省略 varargs,但这是 Clojure 处理 varargs 与 Java 差异的一个案例。为了完整性,以下是关于 Java 如何处理 vararg 方法的一个简要概述,这可能有助于讨论 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" null)}}| |
|{{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"]))}}| |