黑马程序员技术交流社区

标题: 关于可变参数 [打印本页]

作者: 冯晓骏    时间: 2013-12-26 17:32
标题: 关于可变参数
关于可变参数,一直觉得不是很好用,我做了一下测试第一种:传入对应类型的引用数据类型数组,这个时候可变参数会被作为数组直接打开操作

  1. public class Demo1{
  2.         public static void main(String[] args){
  3.                 Object[] objs = new Object[3];
  4.                 show(objs);
  5.         }
  6.         private static void show(Object ...objs){
  7.                 for(Object obj:objs){
  8.                         System.out.println(obj);
  9.                 }
  10.         }
  11. }
复制代码
第二种:传入非引用数据类型数组,这个时候如果形参的类型是实参类型的父类,就可以被类型提升并当作一个元素来操作
  1. public class Demo1{
  2.         public static void main(String[] args){
  3.                 int[] objs = new int[3];
  4.                 show(objs);
  5.         }
  6.         private static void show(Object ...objs){
  7.                 for(Object obj:objs){
  8.                         System.out.println(obj);
  9.                 }
  10.         }
  11. }
复制代码
第三种:传入不同类型的引用数据类型数组,这个时候就会有警告,提示最好不要进行这样的类型转换
  1. public class Demo1{
  2.         public static void main(String[] args){
  3.                 Integer[] objs = new Integer[3];
  4.                 show(objs);
  5.         }
  6.         private static void show(Object ...objs){
  7.                 for(Object obj:objs){
  8.                         System.out.println(obj);
  9.                 }
  10.         }
  11. }
复制代码
第四种:参数列表为数组类型,这个时候就不会有警告
  1. public class Demo1{
  2.         public static void main(String[] args){
  3.                 Integer[] objs = new Integer[3];
  4.                 show(objs);
  5.         }
  6.         private static void show(Object[] objs){
  7.                 for(Object obj:objs){
  8.                         System.out.println(obj);
  9.                 }
  10.         }
  11. }
复制代码
而且,我们在传入参数的时候,一般不是一个,就是多个且放到一个数组中,
再者,由于JDK1.4到1.5的升级过程中存在的一些兼容问题
传入数组时就感觉非常的混乱
我们是做工程的,不是搞算法的,没必要把代码写的那么模棱两可
稳定,可读性和复用性是最初的前提
所以我觉得最好这样写
无论参数列表是可变参数还是数组类型,无论传入的参数是一个还是多个
都用数组表示
比如需要传入Object类型的可变参数
我们就用Object[]数组来表示,里面放上我们传入的参数列表,new Object[]{int[]{},String[]{},1,3,'a',。。。}
这样无论他参数列表是哪种形式,都可以正确的接收,也把自己的代码统一了起来,不至于到一个地方就有不同的书写,虽然做的事都是一样的
还有,就是为什么没有采用都转为Object当作单个元素用可变参数来接收
很明显
你写Object[]{1,2,3}比你写(Object)1,(Object)2,来的方便多了
这是我的一点看法,希望跟大家讨论下,反正我觉得什么静态导入,可变参数之流简直弱爆了,
泛型也就那么回事,没有什么实际意义,而且还把书写变得那么麻烦
JDK1.5的新特性有几个还好,有几个真个很鸡肋





作者: 小骗子    时间: 2013-12-26 19:05
顶一个,写的比较透彻
作者: doitforyou    时间: 2013-12-26 19:25
其实新特性都不错,只不过为了达到兼容效果就比较扯淡了,搞得云里雾里的。
如果不是为了兼容,其实新特性都是比较好用,静态导入我们不常使用,有点鸡肋,貌似就简化了下书写。
但是可变参数还是比较实用的,比如你模拟计算器的时候,如果不用可变参数和泛型,写起来就要用到挺多重载。
不过你理解的确实很好,对人挺有帮助的,写的时候只采用Object数组的形式不易混淆。
就怕面试遇到这种问题,太扯了,这个问题困扰了我好一段时间。
作者: 冯晓骏    时间: 2013-12-26 19:47
doitforyou 发表于 2013-12-26 19:25
其实新特性都不错,只不过为了达到兼容效果就比较扯淡了,搞得云里雾里的。
如果不是为了兼容,其实新特性 ...

我也困扰了很长时间
写计算器用到很多重载不是很明白,能解释下么
作者: doitforyou    时间: 2013-12-26 23:33
冯晓骏 发表于 2013-12-26 19:47
我也困扰了很长时间
写计算器用到很多重载不是很明白,能解释下么

我们平时计算中,不确定会传入多少参数进行计算,也不确定类型,如果没有泛型和可变重载的话,比如你写一个加法功能,对于参数类型不同你都要重载,参数个数不同你也要重载,或者使用5之前的Object[]参数,但是使用Object[]作为参数的话,不可以传入基本类型和单个变量,有很大局限性,我感觉这个时候泛型和可变参数就很好。
作者: 冯晓骏    时间: 2013-12-27 00:36
doitforyou 发表于 2013-12-26 23:33
我们平时计算中,不确定会传入多少参数进行计算,也不确定类型,如果没有泛型和可变重载的话,比如你写一 ...

确实,你说的这种情况是应该泛型和可变参数配合使用,会使得代码编写更快捷方便,但话说回来,打开了一扇窗,又砸烂了一扇窗,有历史的语言都会出现这样的问题,估计当初开发的时候就是为了让这种情况而去开发的,但是同时又造成一系列不可预见的兼容问题,就像Java把String类定义为常量一样,简直就是灾难性的,所以后来又出现了StringBuffer和StringBuilder,我想,任何有历史的语言都要经受这些,相信今后的java会把这些新特性做的更好,不会再这么模棱两可
作者: doitforyou    时间: 2013-12-27 08:02
冯晓骏 发表于 2013-12-27 00:36
确实,你说的这种情况是应该泛型和可变参数配合使用,会使得代码编写更快捷方便,但话说回来,打开了一扇 ...

呵呵,JDK的升级都是不错的,这些问题也是可以预见的,主要就是考虑到5之前版本的用户和程序运行,不然不会存在这些兼容问题的,再等上一些年,如果JDK5之前的版本既没有用户也没有程序了,直接就不用兼容了,到时候ORCALE可以改进下JDK,全部使用JDK5或者更高级的版本进行编译,这些问题就子虚乌有了。
这个升级的过程个人感觉最难的地方不是新特性的使用,而是新特性如何兼容老版本。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2