如何在java中定义可以接受任意参数的方法?

如何在java中定义可以接受任意参数的方法?,java,Java,如何在java中定义可以接受任意参数的方法?有演示吗?这里是一个关于变量参数的简单示例。示例代码: public void foo (ParamType ... name) { } 是在Java5中引入的 例如: public String join(String... parts); 这实际上是一个快捷方式: public String join(String[] parts); parts参数在方法中用作数组,但是可以在不构造数组的情况下调用该方法(如obj.join(新字符串[]

如何在java中定义可以接受任意参数的方法?有演示吗?

这里是一个关于变量参数的简单示例。示例代码:

public void foo (ParamType ... name) { 

}
是在Java5中引入的

例如:

public String join(String... parts);
这实际上是一个快捷方式:

public String join(String[] parts);
parts
参数在方法中用作数组,但是可以在不构造数组的情况下调用该方法(如
obj.join(新字符串[]{part1,part2,part3})

但是要非常小心,因为可能会出现歧义。例如:

public void write(String author, String... words);
public void write(String... words);
public String publishBook(String title, [String author], 
      [String isbn], [boolean hardcover]); // [..] would mean optional
如果
obj.write(“Mike”,“jumps”)
,将调用哪个方法?编译器足够聪明,可以检测到歧义,但我曾经遇到过一些编译器没有发现此类问题的情况(不能准确地回忆起)

当对象的类型相同或至少具有相同的功能目标时,使用varargs是可行的。如果你想要不同的论点。例如:

public void write(String author, String... words);
public void write(String... words);
public String publishBook(String title, [String author], 
      [String isbn], [boolean hardcover]); // [..] would mean optional

然后需要

要传递数量可变的参数,可以使用varargs语法(您指定一个类型,后跟一个省略号,并且所谓的命名参数是指定类型的数组,Java将添加一些语法糖,以便您可以传入该类型的任意数量的列表,它将自动放入数组中)

对于传递任意类型,可以使用Java泛型来允许任意类型,也可以使用类型对象。通常最好使用泛型,因为可以进行更多的类型检查,但两者都可以

以下是varargs的一个示例:

public static void printAll(String... args){ for (String str : args ){ System.out.println(str); } } // Now can write printAll("Hello", "world", "etc", "etc"); 公共静态void printAll(字符串…参数){ for(字符串str:args){ 系统输出打印项次(str); } } //现在可以写printAll(“你好”、“世界”、“等等”); 以下是泛型的一个示例:

public static <T> void print(T obj){ System.out.println(obj.toString()); } 公共静态无效打印(T obj){ System.out.println(obj.toString()); }
恐怕java还不能完成这个(与其他语言不同),即使你考虑VARARGS(因为它们只属于一种类型)。 然而,OO模式是您的朋友,您可以使用Builder模式来完成您所需要的

有了这个,你可以做类似的事情

NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8). 
calories(100).fat(35).build(); 
现在最酷的是,你可以添加一些方法 varargs也是,这使得这个特殊的模式非常强大
你的对象是不可变的,这样你就不用编写伸缩构造函数了。它不起作用的是你的盘子,但我生活在希望中;)

它在一般情况下不起作用。即使您将方法定义为:

    @SafeVarargs
    public void callMe(Object... args) { ... }
当您调用
callMe(1,“你好”,3.14159,new Object())
时,这将起作用。但是,如果希望在接口上使用类似的方法,则不能使用
@SafeVarargs
,因为它只能添加到最终方法中(以免被不安全的实现覆盖)

在这种情况下,您最好在界面中定义:

    @SuppressWarnings("unchecked")
    public <T> void callMe(T... args);

别忘了,既然
Object…
不过是
Object[]
的语法糖,你不能简单地调用`callMe(newobject[]{“a”}),因为这会造成一个模棱两可的情况:你想用一个对象(恰好是一个数组)调用callMe吗或者使用数组的元素?

你说“任意参数”是什么意思?任意数量的参数?还是任意类型?您应该注意,这是有效Java的摘录^^^下次您应该更仔细地阅读我的答案(mk?:)“一个简短的例子(从有效的Java第二版改编并缩短)”我大体上同意,除了一件事:“公共字符串连接(字符串…部分);这实际上是一个快捷方式:公共字符串连接(字符串[]部分);”。这不是快捷方式,因为您不能将join(String[]parts)称为join(“a”、“b”、“c”),而不是join(String…parts)