jdk1.5之三 —— varargs methods

 如此细节且微不足道的东西都有了,java是不是该考虑一下引用参数了?

——Fantasy Dog

这个东西在c里好像叫作可变参数,即参数的数目是可变的。

格式:xxx Method(int first, object ... next)

所谓的varargs就是第二个参数,表示的意思是参数类型为object, 这种参数可以有无限多个,最后可以用

object[] 类型的next来操作这些varargs

要求:每个函数只能有一个varargs,并且必须放在最后

实现:编译器遇见varargs后,就把它(object ... next)变成(Object[] next = new Object[]{}),然后根据特定的函数调用在大括号里加入参数,又因此next就成了一个数组引用。

Java in a Nutshell 5.0th里说,varargs有个不常见的毛病:

// Now consider the following Object[], which we wish to pass
// as a single argument, not as an array of two arguments.
Object[] arg =  new Object[] { "hello", "world" };
// These two lines do the same thing: print "hello".  Not what we want.
out.printf("%s/n", "hello", "world");
out.printf("%s/n", arg);

// If we want arg to be treated as a single Object argument, we need to
// pass it as an the element of an array.  Here's one way:
out.printf("%s/n", new Object[] { arg });

// An easier way is to convince the compiler to create the array itself.
// We use a cast to say that arg is a single Object argument, not an array:
out.printf("%s/n", (Object)arg);

即当你想把一个Object[]类型的参数当作Object传递给函数时,函数却只能把该Object[]的所有元素当作参数来用,因此如果你想干上面这个事,就得强制类型转换一下。

不过这么想实在比较麻烦且糊涂。回头看一下varargs的实现就知道了,varargs实际上是被当作数组传递的,因此当你说 Method(1,2,3,4)时,编译器帮你转换成Method(int[] array = new int[]{1,2,3,4}),而当你直接传递个int[]类型的参数进去时,编译器就觉得自己省心了。

所以varargs实际上接受两种参数:1.某数组的引用,2.或者直接把这个数组的元素当参数罗列。

似乎又有点像 automatic Boxing…………

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值