有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

变量函数具有可变参数类型和数量的Java方法

我对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) {}
...

共 (3) 个答案

  1. # 1 楼答案

    在后台,这两个方法将使用相同的签名进行编译。e、 g.vararg是创建新数组的语法糖

    这两种方法都是等效的

    public void example(int[] array)
    
  2. # 2 楼答案

    int...参数可以同时接受int和int数组。你只需要一种方法来处理这两个问题

    public void example (int... args) { }
    

    调用示例:

    example(1, 2, 3);
    example(new int[] { 1, 2, 3 });
    

    And, looking to the future how could I implement support for multiple numeric value types, such as a float?

    您可以尝试使用Number,它是IntegerFloat的超类。但老实说,这既尴尬又低效,不值得。标准API方法往往只对所有数字类型进行重载

    public void example (int... args) { }
    public void example (long... args) { }
    public void example (float... args) { }
    public void example (double... args) { }
    
  3. # 3 楼答案

    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) { }