search.png
关于我
menu.png
Java review(16) ... 可变参数列表

可变参数列表是Java的语法糖之一:


    static void a(String... strings) {
        System.out.println(Arrays.toString(strings));
    }

    @Test
    public void test1() throws Exception {
        a();
        a("1");
        a("1", "2");
        a(new String[] {"1", "2", "3"});
        a(Arrays.asList("1", "2", "3", "4").toArray(new String[]{}));
    }

通过这种方式可以动态的选择传递多个参数或者不传递参数
输出:

[]
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]

它支持任意类型,包括int、int[]

    static void b(int... ints) {
        System.out.println(Arrays.toString(ints));
    }
    static void b2(int[]... ints) {
        System.out.println(Arrays.toString(ints));
    }

int[] 时代表传入的是二维数组了。

我们可以通过Object... objects来使得这一特性进一步增强:

static void c(Object... objects) {
        System.out.println(Arrays.toString(objects));
    }

    @Test
    public void test2() throws Exception {
        c();
        c("1");
        c("1", "2");
        c(new String[] {"1", "2", "3"});
        c(Arrays.asList("1", "2", "3", "4").toArray(new String[]{}));
        c(new int[] {1, 2, 3, 4, 5});
        c(Arrays.asList(1.23, 1.2, 1.55).toArray(new Double[]{}));
    }

编译时有警告,告诉我们

在这里插入图片描述
在这里插入图片描述

这个警告和输出是契合的,我们传入的是new int[] {1, 2, 3, 4, 5},期望他被当作数组,而实际上他被当作一个单独的对象:

[]
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[[I@5e8c92f4]        <== 因为 Object o = new int[] {1, 2, 3, 4, 5} 也成立
[1.23, 1.2, 1.55]

难得的,Java只是警告而不是直接编译错误。

可以将固定参数和可变参数配合使用,但是可变参数只能放在最后面

    static void d(int t, Object... objects) {
        for (int i = 0; i < t; i ++) {
            System.out.println(Arrays.toString(objects));
        }
    }

    @Test
    public void test3() throws Exception {

        d(2,"1", "2");
        d(3, new Object[] {"1", "2", "3"});
    }

输出:

[1, 2]
[1, 2]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]

版权声明

知识共享许可协议 本文章由作者“衡于墨”创作,转载请注明出处,未经允许禁止用于商业用途

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
发布时间:2019年11月29日 15:47:34

评论区#

还没有评论哦,期待您的评论!

关闭特效