爲了解決程序中的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);
其編譯結果爲: