泛型的定義(1)

爲了解決程序中的ClassCastException異常,最穩妥的方法就是避免進行強制向下轉型。而泛型技術的優點在於將類中的成員變量、函數的參數以及返回值變成動態標記,在實例化對象的時候動態地規定使用的數據類型。
泛型的定義:

class Dimen<T>{
	private T x;//向量的x座標
	private T y;//向量的y座標
	public void setX(T x){
		this.x = x;		
	}
	public void setY(T y){
		this.y = y;		
	}	
	public T getX(){
		return this.x;
	}
	public T getY(){
		return this.y;
	}
}

這段代碼是上篇文章中的所有的Object被替換成T得來的,在類的後面使用來進行泛型的定義。

public class DimenTest{
	public static void main(String[]args){
		Dimen dimen = new Dimen();
		dimen.setX(5);
		dimen.setY(7);
		int x = dimen.getX();
		int y = dimen.getY();
		System.out.println("該向量爲:" + x + "i" + "+" + y + "j");
	}
}

如果在對象實例化的時候不給泛型規定一個類型,便會出現下面這種錯誤。
在這裏插入圖片描述
會直接報錯無法編譯,提示說明Object無法轉換爲int。這是因爲如果在對象實例化時,如果我們不給泛型一個類型,系統會默認給予泛型一個Object類型,與下面的代碼是等價的:

class Dimen<Object>{
	private Object x;//向量的x座標
	private Object y;//向量的y座標
	public void setX(Object x){
		this.x = x;		
	}
	public void setY(Object y){
		this.y = y;		
	}	
	public Object getX(){
		return this.x;
	}
	public Object getY(){
		return this.y;
	}
}

但是如果我們在對象實例化的時候規定一下泛型的類型,例如:

Dimen<Integer> dimen = new Dimen<Integer>();

這行代碼就直接規定了泛型的類型,相當於將Dimen類中的所有的T全部換成Integer,等價於如下代碼:

class Dimen<Integer>{
	private Integer x;//向量的x座標
	private Integer y;//向量的y座標
	public void setX(Integer x){
		this.x = x;		
	}
	public void setY(Integer y){
		this.y = y;		
	}	
	public Integer getX(){
		return this.x;
	}
	public Integer getY(){
		return this.y;
	}
}

完整代碼爲:

class Dimen<T>{
	private T x;//向量的x座標
	private T y;//向量的y座標
	public void setX(T x){
		this.x = x;		
	}
	public void setY(T y){
		this.y = y;		
	}	
	public T getX(){
		return this.x;
	}
	public T getY(){
		return this.y;
	}
}

public class DimenTest{
	public static void main(String[]args){
		Dimen<Integer> dimen = new Dimen<Integer>();
		//給成員變量賦值
		dimen.setX(5);
		dimen.setY(7);
		//獲取成員變量,由於getger的返回值類型是Object,所以需要使用向下轉型
		int x = dimen.getX();
		int y = dimen.getY();
		System.out.println("該向量爲:" + x + "i" + "+" + y + "j");
	}
}

其運行結果如下:
在這裏插入圖片描述
在編譯和運行的過程中沒有任何的警告或異常。但是如果將setter裏面傳入的數字改成Double型,則編譯直接不通過,如:

dimen.setY(1.5);

其編譯結果爲:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章