1. 程式人生 > >《java開發實戰經典》李興華——C10. 泛型

《java開發實戰經典》李興華——C10. 泛型

一、為什麼使用泛型

類轉換異常,出現了型別安全問題

二、泛型應用

1.泛型的基本應用

在定義類時,通過一個識別符號表示類的種某屬性的型別,或某種方法的返回值及引數型別。

這樣在例項化時只需要指定好需要的型別即可。

2.示例:

public class Test{
	public static void main(String[] args) {
		Point<String> p = new Point<String>();
		p.setVar("李興華");
		System.out.println(p.getVar().length());
	}
}

class Point <T>{
	private T var;
	public T getVar() {
		return var;
	}
	public void setVar(T var) {
		this.var = var;
	}
}

3.泛型中的構造方法

class Point <T>{
	private T x;
	private T y;
	
	public Point(T x,T y) {
		this.setX(x);
		this.setY(y);
	}
	public T getX() {
		return x;
	}
	public void setX(T x) {
		this.x = x;
	}
	public T getY() {
		return y;
	}
	public void setY(T y) {
		this.y = y;
	}
}

public class Test{
	public static void main(String[] args) {
		Point<Integer> p = new Point<Integer>(11, 22);
		int x = p.getX();
		int y = p.getY();
		System.out.println("整數表示,X座標:"+x);
		System.out.println("整數表示,Y座標:"+y);
	}
}

4.指定多個泛型型別

class Notepad <K,V>{
	private K key;
	private V value;
	public K getKey() {
		return key;
	}
	public void setKey(K key) {
		this.key = key;
	}
	public V getValue() {
		return value;
	}
	public void setValue(V value) {
		this.value = value;
	}
}

public class Test{
	public static void main(String[] args) {
		Notepad<String,Integer> n = new Notepad<String,Integer>();
		n.setKey("李興華");
		n.setValue(30);
		System.out.println("姓名:"+n.getKey());
		System.out.println("年齡:"+n.getValue());
	}
}

三、泛型的安全警告

使用者在宣告物件時最好指定其內部的資料型別,否則就會出現不安全的警告資訊。

編譯時警告,但不影響程式執行。

四、萬用字元

1.匹配任意型別的萬用字元

class Info <T>{
	private T var;

	public T getVar() {
		return var;
	}

	public void setVar(T var) {
		this.var = var;
	}

	@Override
	public String toString() {
		return this.var.toString();
	}
}

public class Test{
	public static void main(String[] args) {
		Info<String> i = new Info<String>();
		Info<Integer> j = new Info<Integer>();
		i.setVar("李興華");
		j.setVar(30);
		fun(i);
		fun(j);
		System.out.println("內容:"+i.getVar());
	}
	public static void fun(Info<?> temp) {//?:萬用字元
		System.out.println("內容:"+temp);
	}
}

2.受限泛型

1)設定上限: ? extends  類

                         泛型標識   extends  類

2)設定下限:?  super  類

                        泛型標識   super   類

class Info <T>{
	private T var;
	public T getVar() {
		return var;
	}
	public void setVar(T var) {
		this.var = var;
	}
        public String toString() {
		return this.getVar().toString();
	}

}

public class Test{
	public static void main(String[] args) {
		Info<Float> i = new Info<Float>();
		Info<Integer> j = new Info<Integer>();
		i.setVar(6.6f);
		j.setVar(30);
		fun(i);
		fun(j);
	}
	//上限為number,可以傳Byte,Short,Long,Integer,Float,Double
	public static void fun(Info<? extends Number> temp) {
		System.out.println("內容:"+temp);
	}
}
class Info <T>{
	private T var;
	public T getVar() {
		return var;
	}
	public void setVar(T var) {
		this.var = var;
	}
	public String toString() {
		return this.getVar().toString();
	}
}

public class Test{
	public static void main(String[] args) {
		Info<Object> i = new Info<Object>();
		Info<String> j = new Info<String>();
		i.setVar(new Object());
		j.setVar("李興華");
		fun(i);
		fun(j);
	}
	//下限為String,可以傳String,Object
	public static void fun(Info<? super String> temp) {
		System.out.println("內容:"+temp);
	}
}

五、泛型與子類繼承的限制

子類的泛型型別不能用父類的泛型型別接收。如Info<String>不能用Info<Object>接收。

六、泛型介面

1.定義泛型介面

   interface 介面名稱<泛型標識>{ } 

2.泛型介面的兩種實現方式

//第一種:在子類得定義上宣告泛型型別
interface Info<T>{
	public T getVar();
}

class InfoImpl<T> implements Info<T>{

	private T var;
	
	public InfoImpl(T var){
		this.setVar(var);
	}
	
	public void setVar(T var) {
		this.var = var;
	}
	
	@Override
	public T getVar() {
		return this.var;
	}
}

public class Test{
	public static void main(String[] args) {
		Info<String> i = null;
		i = new InfoImpl<String>("lll");
		System.out.println(i.getVar());
	}
}
//第二種:直接在介面中指定具體型別
interface Info<T>{
	public T getVar();
}

class InfoImpl implements Info<String>{

	private String var;
	
	public InfoImpl(String var){
		this.setVar(var);
	}
	
	public void setVar(String var) {
		this.var = var;
	}
	
	@Override
	public String getVar() {
		return this.var;
	}
}

public class Test{
	public static void main(String[] args) {
		Info<String> i = null;
		i = new InfoImpl("lll");
		System.out.println(i.getVar());
	}
}

七、泛型方法