我对Java中的泛型和vararg进行了一些研究,但我似乎找不到如何将它们一起实现到创建具有灵活参数类型和数量的方法(和/或构造函数(中。例如,假设我想创建一个方法,可能需要一个整数数组或数量不固定的整数参数。我可以这样创建第一个:
public void example0 (int[] args) { }
以及后者本身:
public void example1 (int... args) { }
但是我怎样才能将它们组合成一个名字呢?而且,展望未来,我如何实现对多个数值类型(如浮点数(的支持?一个例子将是一个很好的答案。
更新:
谢谢,但显然我用了一个太简单的例子来回答一个更大的问题。考虑到任意数量的参数和任何类型的参数,我将如何处理这个问题?所以说:
public void example(int[] args) {}
public void example(string arg0, int[] args) {}
public void example(string arg0, string arg1) {}
...
int...
参数可以同时接受 int 和 int 数组。您只需要一种方法来处理这两种方法。
public void example (int... args) { }
调用示例:
example(1, 2, 3);
example(new int[] { 1, 2, 3 });
而且,展望未来,我如何实现对多个数值类型(如浮点数(的支持?
你可以尝试使用Number
,它是Integer
和Float
的超类。但老实说,这很尴尬,效率低下,不值得。标准 API 方法往往只对所有数值类型进行重载。
public void example (int... args) { }
public void example (long... args) { }
public void example (float... args) { }
public void example (double... args) { }
public void example1 (int... args) { }
也可以接受int[]
。 所以这就足够了。
要接受多种类型的数值,您可以使用泛型类,该泛型是Number
的子类。
例如:
public class Foo<T extends Number> {
// ...
}
你可以使用它,例如:
Foo<Integer> fooInt = new Foo<>();
Foo<Float> fooFloat = new Foo<>();
但请注意,由于拆箱操作,它的效率将低于原始。因此,通常建议对每个基元类型使用重载方法:
public void example1 (int... args) { }
public void example1 (long... args) { }
public void example1 (double... args) { }
在后台,这两种方法都将使用相同的签名进行编译。 例如,vararg 是用于创建新数组的语法糖。
这两种方法都等效于此。
public void example(int[] array)