`
kaka2008
  • 浏览: 91597 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java可变参数

    博客分类:
  • java
阅读更多
在动态语言,如ruby中,可以实现可变参数
   def test(* arg)
      for s in arg
        puts s,s.class
      end
   end
 
   test(1,"2",2.3)
 

只需在参数前加一个*即可。
调用方法时,可以传入任意数量,任意类型的参数了。
一直以为可变参数是动态语言的特性呢。
最近才发现,java里原来也可以实现可变参数。
SE5之前,我们如果想实现可变参数的效果,可以通过一个数组或Collection
 
    public static void test(String [] args){
       for (int i = 0; i < args.length; i++) {
          System.out.println(args[i]);
       }
    }
  

  如果是想不同类型的参数一起传,可以使用Collection,例如List等。
  在SE5之后,java添加了这个新功能。也很简单。 只用三个点号(...)
 
    public static void test(int ...objects){
        //参数都是int类型的,所以可以用foreach
	for (int object : objects) {
	   System.out.println(object);
	}
    }
    public static void main(String [] args){
        test();
        test(1);
        test(1,2,3,4,5);
    }
  

  参数类型可以是Object的。
  另外,如同ruby中一样,可变参数可以与固定的参数相结合,不过需要注意的是,如果结合使用,那么可变参数必须卸载最后面。
 
     public static void test(String str,Object ...objects){
	  System.out.println("str="+str);
	  for(Object obj : objects){
		System.out.println(obj);
	  }
      }
      public static void main(String [] args){
        test("abc");
        test("abc",1,"abc",88.8f);
      }
  

  另外,一个方法中,只能定义一个可变参数!

  知道了这个特性以后,以后可以在项目中使用了,应该会带来一些方便。
  下面,让我们来看看具体使用的例子。
  在Collections类的addAll方法中
 
    /* 
     * ...
     * @since 1.5
     */
    public static <T> boolean addAll(Collection<? super T> c, T... elements) {
        boolean result = false;
        for (T element : elements)
            result |= c.add(element);
        return result;
    }
  

  采用了范型,所以可变参数的类型也可以使任意类型的。
  来看个例子
 
    public static void main(String [] args){
       Collection col = new LinkedList();	
       boolean flag = Collections.addAll(col, 123,123.0f,888.0,"float",'c');
       for(Iterator ite = col.iterator();ite.hasNext();){
	   Object obj = ite.next();
	   System.out.print(obj.getClass().getName());
	   System.out.println("   "+obj);
       }
    }
  

  不加范型,参数可以是任意类型的
  加上范型,参数类型即可指定
 
    public static void main(String [] args){
       Collection<String> col = new LinkedList<String>();	
       boolean flag = Collections.addAll(col,"int","float","string","123","char");
       for(Iterator ite = col.iterator();ite.hasNext();){
	   Object obj = ite.next();
	   System.out.println("   "+obj);
       }
    }
  

 
分享到:
评论
3 楼 metallica_1860 2010-04-09  
george_space 写道
jcs7575 写道
你要说明什么??


2 楼 george_space 2009-08-20  
jcs7575 写道
你要说明什么??

1 楼 jcs7575 2009-08-19  
你要说明什么??

相关推荐

Global site tag (gtag.js) - Google Analytics