可变参数与泛型方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liu16659/article/details/52153391

在《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,均可以作为参数使用。

程序的执行结果如下:

2.泛型方法

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

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

package generics;
public class Test2{
	public static <T> void print(T...obj){
		for(int i= 0;i<obj.length;i++){
			System.out.println(obj[i]);
		}
	}
	public static void main(String [] args){
		print("java",1,true,1.343);
	}
}

(1):这里我们将

public static  void print(Object...obj){<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">修改成</span><span style="font-family: Arial, Helvetica, sans-serif;">public static <T> void print(T...obj)</span>

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

执行结果如下:



3.可变参数与范型方法

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

package generics;
import java.util.*;

public class GenericVarargs {
	
  public static <T> List<T> makeList(T... args) {
    List<T> result = new ArrayList<T>();
    for(T item : args)
      result.add(item);
    return result;
  }
  public static void main(String[] args) {
    List<String> 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 <T> List<T> makeList(T...args)中,第一个<T>表示的是这是一个泛型方法,后面的 List<T>表示的是该方法返回的是一个List<T>的对象,后面的(T...args)表示可变参数列表。

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

展开阅读全文

没有更多推荐了,返回首页