java string 长度可变_JAVA 的 可变长度的 方法的 参数 比如 String...arg

本文探讨了Java中`main`方法签名的两种形式:`String...args`和`String[]args`,指出它们对于虚拟机是等价的,但在编程使用时存在差异。可变参数`...`允许传入零个或多个参数,可能导致重载问题。此外,当可变参数与泛型结合时,由于原始类型和泛型的限制,会出现编译错误。在使用可变参数时需要注意其位置、调用方式和重载规则。
摘要由CSDN通过智能技术生成

参考地址:http://www.cnblogs.com/lanxuezaipiao/p/3190673.html

http://zhidao.baidu.com/link?url=3l_o0uq0Fhhe4r_zkv3IisvAepzvHbLULt_6NIP7mhlKGUlqrtJs-OF0nD07uBOhTgTBqJidW_-yZkCmXA6aAK

main方法的签名其实可以这样写:

public static void main(String... args)//方法1

它也可以运行.

并且,如果同时还存在

public static void main(String[] args)//方法2

会报已经存在重复的方法的错误.

由此可见,String... args跟String[] args对于虚拟机来说其实是一回事.

而且,在方法内,通过...传进来的参数的使用方法也跟一个数组完全无二,可以for循环,甚至可以直接转换:

public static void main(String... args)

{

String[] ss=args;

}

但对于程序员来说却还是有差别的.

1.调用

我们只能这样调用方法2:

main(new String[]{});

即,方法2只能接受String数组做参数.

而我们陌生的方法1可强了,用以下参数调用,照单全收:

main();

main(null);

main(null,null);

main(null,null,null);

......

main("a");

main("a","b");

main("a","b","c");

......

main(new String[]{});

(String...匹配String*,而null也可以是一个特殊的String)

2.参数位置

使用...的参数只能是最后一个参数.不然谁知道你调用的时候,点点点匹配到哪个实参?

public static void main(String[] args,int index)//可以

public static void main(String... args,int index)//不行!

3.重载

假设有以下两个方法:

public static void main(String... args)//方法1

public static void main(String a,String... args)//方法3

从语法上来看,这个重载完全没有错误,eclipse也没有报错.但是当调用时使用的参数个数大于这些方法中点点点参数前面的参数个数时,eclipse就会发现这个错误了.很拗口是不是?嘿嘿~还是举例来说吧.以上这两个方法,如果调用时

main();

编译器会认出这个调用的是方法1.但是如果调用时

main("");

编译器就疯了...因为一个String参数,既符合方法1的点点点,也符合方法3的String+点点点,编译器就不知道调用的是哪个方法了.

String[]参数不会有这种问题.

所以重载时要注意,如果点点点参数前面有跟它类型相同的参数...最好的方法,似乎就是换回数组形式了,要么就给方法改个名字吧.

4.遇上泛型加外包

用个实例来说

java.util.Arrays是个工具类,所有方法都是静态的,对数组的操作.里面有个方法asList(T... args),用来把类型T的数组转化成List.

这是个很有用的方法,在绝大多数情况下都能如你所愿.

但是,你可以试试下面的写法

int[] is=...//自定义的数组,或者从什么地方获取来的数组

List list=Arrays.asList(is);

很不幸,不要说执行,编译都通不过.错误的意思大概是:

不能将List转化成List

明白了吧?

你的设想是,把int[]中的每一个元素对应T...中的每一个点,

可编译器不这么想.因为int是原始类型,不是Object的子类.而泛型T隐含的条件是T extends Object.所以编译器不会把每一个int看做T,不会把int[]看做T点点点.虽然java已经支持自动将原始类型封包成外包类,但那是单个的情况.

而数组(不管什么类型)则是一种特殊的类型,是Object的子类,所以编译器觉得整个int[]对应一个T,你调用的方法是asList(int[]... args)而不是你想象中的asList(Integer...)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值