可变参数与泛型方法

在《Thinking in Java》中的Chapter 15中,介绍到可变参数与泛型方法。我看了一些之后,发现很难理解,上网也找了一点资料,但是却很匮乏,于是打算自己写一篇,来全面的解释这个问题。

1.可变参数列表

先上代码:

package generics;

//可变参数列表
public class Test2 { 
	public static void print(String str,Object... obj) {    
		System.out.println("str="+str);
		for (int i = 0; i < obj.length; i++) {
			System.out.println(obj[i]); 
		} 
	} 
	public static void main(String[] args) { 
		print("phl",1,2,"multiple parameters",true,3.2134); 
	} 
}

(1)在这个例子中,可能感到奇怪的地方有如下几点:

public static void print(String str,Object... obj);

这里的参数Object...obj是什么意思呢?

其含义就是可变参数列表,“...”是可变参数列表的特殊标志。意思就是只要是属于Object类都可以作为参数传递进来。我们都知道,在Java中,所有的类都是直接或者间接继承自Object类。所以我们可以这么写代码

print("phl",1,2,"multiple parameters",true,3.2134);   

Integer,String,Boolean,Float,均可以作为参数使用。

程序的执行结果如下:

可变参数与泛型方法_第1张图片

 

2.泛型方法

在上面的例子中,可以看到,虽然我们可以直接继承自Object类,但是Java中推出了一中方法----泛型,来让这种参数变成某种不确定的类型,从而让更多的类型适用。【这里,我也在思考为什么不直接使用Object类而非要适用泛型呢?】

所以我们将上面的那个代码稍作修改,呈如下:

package generics;
public class Test2{
	public static  void print(T...obj){
		for(int i= 0;i

(1):这里我们将

public static  void print(Object...obj)
修改成
public static  void print(T...obj)

这里的即是范型方法的标志,然后在参数列表中以可变参数列表标出。

执行结果如下:

可变参数与泛型方法_第2张图片
 

3.可变参数与范型方法

下面我们来看一个稍微复杂的实例

 

package generics;
import java.util.*;

public class GenericVarargs {
	
  public static  List makeList(T... args) {
    List result = new ArrayList();
    for(T item : args)
      result.add(item);
    return result;
  }
  public static void main(String[] args) {
    List ls = makeList("A");
    System.out.println(ls);
    ls = makeList("A", "B", "C");
    System.out.println(ls);
    ls = makeList("ABCDEFFHIJKLMNOPQRSTUVWXYZ".split(""));
    System.out.println(ls);
  }
}


(1):public static List makeList(T...args)中,第一个表示的是这是一个泛型方法,后面的 List表示的是该方法返回的是一个List的对象,后面的(T...args)表示可变参数列表。

 

(2):再往后面,程序就简单啦,按照你所想的执行应该是没有问题的。

你可能感兴趣的:(#,Java)