泛型可以解決資料型別的安全性問題,它主要的原理是:是在類宣告的時候通過乙個標識表示類中某個屬性的型別或者是某個方法的返回值及引數型別。這樣在宣告類或例項化的時候只要指定好需要的型別即可。
泛型的定義格式:
[訪問許可權] class 類名稱《泛型型別1,泛型型別2,….,泛型型別3>;
[訪問許可權] 返回值型別宣告 方法名稱(泛型型別標識 變數名稱){};
}
泛型物件定義:
類名稱《具體類》 物件名稱 =new 類名稱《具體類》();
簡單泛型**如下:
class point
public t getvar()
}public class gennericdemo01
}
構造方法可以為類中的屬性初始化,那麼如果類中的屬性通過泛型指定,而又希望通過構造設定屬性內容的時候,那麼構造方法中的定義與之前並無不同,不需要像宣告類那樣指定泛型。其格式如下:
[訪問許可權] 構造方法(《泛型型別》 引數名稱){};
**示例:
class point
public void setvar(t var)
public t getvar()
}public class gennericdemo02
}
在泛型中也可以指定多個泛型的型別:
class notepad//為泛型指定兩個型別 型別自定義
public v getvalue()
public notepad(k key,v value)
}public class gennericdemo03
}
觀察一下的**:
class info
public t getvar()
}public class gennericdemo04
public static void fun(infotemp)
}
注意:泛型物件進行引用傳遞的時候,泛型型別必須是一致的。
如果現在非要進行傳遞,則可以將方法中info引數的型別取消掉,但是取消掉畢竟不是最好的處理方式,畢竟之前已經指定了泛型了。那麼可以採用使用?的形式。
class info
public t getvar()
}public class gennericdemo05
public static void fun(info<?> temp)
}
如果使用的是? 意味著可以接收任意的內容,但是?並不代表著具體的型別,所以此內容卻無法直接使用<?>修飾的泛型物件進行修改。**解釋如下:
class info
public t getvar()
}public class gennericdemo06
}
注意:在使用<?>只能夠接收,但是不能修改
在引用傳遞中,泛型操作中也可以設定乙個泛型物件的範圍上限和範圍下限。範圍上限使用extends關鍵字宣告,表示引數化的型別可能是有所指定的型別,或者是此型別的子類,而範圍下限使用super關鍵字進行宣告,表示引數化的型別可能是所指定的型別,或者是此型別的父型別,直至object類。
設定上限:
宣告物件: 類名稱<? extends 類》 物件名稱
定義類:[訪問許可權] 類名稱《泛型標識 extends 類》{};
設定下限:
宣告物件: 類名稱<? super 類》 物件名稱
定義類:[訪問許可權] 類名稱《泛型標識 extends 類》{};
class info
public t getvar()
public string tostring()
}public class gennericdemo07
//接收info物件,返回上限設定為number,所以只能接收數字型別
public static void fun(info<? extends number> temp)
}
上限設定在類中的應用:
class info
public t getvar()
public string tostring()
}public class gennericdemo08
}
當使用的泛型只能在本類及其父類型別上應用的時候,就必須使用泛型的範圍下限設定。
class info
public t getvar()
public string tostring()
}public class gennericdemo09
public static void fun(info<? super string> temp)
}
注意:乙個類的子類可以通過物件多型性,為其父類進行例項化,但是在泛型操作中,子類的泛型型別是無法使用父類的泛型型別接收的,例如:info不能使用info接收,只能是型別完全一致或者是採用info<?>的格式進行接收,但是也要注意,使用info<?>的形式是不能為物件設定值的,只能用來接收。
在jdk1.5之後,不僅僅可以宣告泛型類,也可以宣告泛型介面,宣告泛型介面和宣告泛型類的語法相似,也是在介面名稱後面加上,如以下的格式:
[訪問許可權] inte***ce 介面名稱《泛型標識》{};
inte***ce info//在介面上定義泛型
private t var;
public t getvar
}
如以下的**:
inte***ce info
class infoimplimplements info
}
定義子類:在子類的定義上也宣告泛型型別。
inte***ce info//在介面上定義泛型
class infoimplimplements info//定義泛型介面的子類
public void setvar(t var)
public t getvar()
}public class gennericdemo02
}
如果現在實現介面的子類不想使用泛型型別宣告,則在實現介面的時候可以指定好具體的泛型型別。
inte***ce info//在介面上定義泛型
class infoimpl implements info//定義直接使用string型別的泛型型別
public void setvar(string var)
public string getvar()
}public class gennericdemo03
}
泛型方法中可以定義泛型引數,此時,引數的型別就是傳入資料的型別,使用如下的格式定義泛型方法:
[訪問許可權] 《泛型標識》 泛型標識 方法名稱(泛型標識 引數名稱)
如以下的**:
class demo
}public class gennericdemo04
}
**如下:
class info
public void setvar(t var)
public string tostring()
}public class gennericdemo05
public static infofun(t temp)
}
泛型陣列
使用泛型方法的時候,也可以傳遞或返回乙個泛型陣列。
public class gennericdemo06
public static t fun1(t...arg)
public static void fun2(t param)
}}
泛型(萬用字元)
1 宣告好泛型型別之後,集合中只能存放特定型別元素 2 泛型型別必須是引用型別 3 使用泛型後取出元素不需要型別轉換.泛型函式 當函式中使用了乙個不明確的資料型別,那麼在函式上就可以進行泛型的定義。public 泛型的宣告 返回值型別 函式名 泛型 變數名 泛型類 修飾符 class 類名 泛型 泛...
泛型 萬用字元
利用泛型技術雖然解決了向下轉型所帶來的安全隱患問題,但同時又會產生乙個新的問題 即便是同乙個類,但是由於設定泛型型別的不同,那麼其物件表示的含義也是不同,是不能夠直接進行引用操作的,例如 現在有如下乙個類。class message public t getmsg 使用萬用字元 解決引數傳遞問題 p...
泛型萬用字元
萬用字元 叫做萬用字元上限,比如當乙個集合的元素型別使用?號統配符的時候,表示在向這個集合是所有集合的父類。例如如下 public static void test2 list ls test public void test1 extends t 表示 一定t 的子類或者t的本身,看如下 publ...