无名商城论坛

搜索
查看: 305|回复: 0

[其他技术] 【梅开二度】Java可变参数

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 17:20:12 | 显示全部楼层 |阅读模式
定义方法在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。上述定义有几个要点需要注意:可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数Java的可变参数,会被编译器转型为一个数组变长参数在编译为字节码后,在方法签名中就是以数组形态出现的。这两个方法的签名是一致的,不能作为方法的重载。如果同时出现,是不能编译通过的。可变参数可以兼容数组,反之则不成立public void foo(String...varargs){}foo("arg1", "arg2", "arg3");//上述过程和下面的调用是等价的foo(new String[]{"arg1", "arg2", "arg3"});J2SE 1.5 中新增了"泛型"的机制,可以在一定条件下把一个类型参数化。例如,可以在编写一个类的时候,把一个方法的形参的类型用一个标识符(如T)来代表, 至于这个标识符到底表示什么类型,则在生成这个类的实例的时候再行指定。这一机制可以用来提供更充分的代码重用和更严格的编译时类型检查。不过泛型机制却不能和个数可变的形参配合使用。如果把一个能和不确定个实参相匹配的形参的类型,用一个标识符来代表,那么编译器会给出一个 "generic array creation" 的错误public class Varargs {    public static void test(String... args) {        for(String arg : args) {//当作数组用foreach遍历            System.out.println(arg);        }    }    //Compile error    //The variable argument type Object of the method must be the last parameter    //public void error1(String... args, Object o) {}    //public void error2(String... args, Integer... i) {}    //Compile error    //Duplicate method test(String...) in type Varargs    //public void test(String[] args){}}可变参数方法的调用调用可变参数方法,可以给出零到任意多个参数,编译器会将可变参数转化为一个数组。也可以直接传递一个数组,示例如下:public class Varargs {    public static void test(String... args) {        for(String arg : args) {            System.out.println(arg);        }    }    public static void main(String[] args) {        test();//0个参数        test("a");//1个参数        test("a","b");//多个参数        test(new String[] {"a", "b", "c"});//直接传递数组    }}方法重载优先匹配固定参数调用一个被重载的方法时,如果此调用既能够和固定参数的重载方法匹配,也能够与可变长参数的重载方法匹配,则选择固定参数的方法:public class Varargs {    public static void test(String... args) {        System.out.println("version 1");    }    public static void test(String arg1, String arg2) {        System.out.println("version 2");    }    public static void main(String[] args) {        test("a","b");//version 2 优先匹配固定参数的重载方法                test();//version 1    }}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表