A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯晓骏 中级黑马   /  2013-12-26 17:32  /  1249 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于可变参数,一直觉得不是很好用,我做了一下测试第一种:传入对应类型的引用数据类型数组,这个时候可变参数会被作为数组直接打开操作

  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的新特性有几个还好,有几个真个很鸡肋




评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
顶一个,写的比较透彻
回复 使用道具 举报
其实新特性都不错,只不过为了达到兼容效果就比较扯淡了,搞得云里雾里的。
如果不是为了兼容,其实新特性都是比较好用,静态导入我们不常使用,有点鸡肋,貌似就简化了下书写。
但是可变参数还是比较实用的,比如你模拟计算器的时候,如果不用可变参数和泛型,写起来就要用到挺多重载。
不过你理解的确实很好,对人挺有帮助的,写的时候只采用Object数组的形式不易混淆。
就怕面试遇到这种问题,太扯了,这个问题困扰了我好一段时间。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
doitforyou 发表于 2013-12-26 19:25
其实新特性都不错,只不过为了达到兼容效果就比较扯淡了,搞得云里雾里的。
如果不是为了兼容,其实新特性 ...

我也困扰了很长时间
写计算器用到很多重载不是很明白,能解释下么
回复 使用道具 举报
冯晓骏 发表于 2013-12-26 19:47
我也困扰了很长时间
写计算器用到很多重载不是很明白,能解释下么

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

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

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