如何在java中定义可以接受任意参数的方法?
如何在java中定义可以接受任意参数的方法?有演示吗?这里是一个关于变量参数的简单示例。示例代码:如何在java中定义可以接受任意参数的方法?,java,Java,如何在java中定义可以接受任意参数的方法?有演示吗?这里是一个关于变量参数的简单示例。示例代码: public void foo (ParamType ... name) { } 是在Java5中引入的 例如: public String join(String... parts); 这实际上是一个快捷方式: public String join(String[] parts); parts参数在方法中用作数组,但是可以在不构造数组的情况下调用该方法(如obj.join(新字符串[]
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泛型来允许任意类型,也可以使用类型对象。通常最好使用泛型,因为可以进行更多的类型检查,但两者都可以
恐怕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)