泛型的初認識
- 泛型是在JDK1.5之后增加的新功能。泛型(Generic)
- 泛型可以解決數(shù)據(jù)類型的安全性問題糠惫,在類的聲明時通過一個標(biāo)示表示類中某個屬性的類型或者是某個方法的返回值及參數(shù)類型谢床。
- 大致格式:
- 訪問權(quán)限 class 類名稱 <泛型,泛型,...> {
屬性
方法
}
- 訪問權(quán)限 class 類名稱 <泛型,泛型,...> {
- 對象的創(chuàng)建: 類名稱<具體類型> 對象名稱 = new 類名稱<具體類型>();
-
將上篇泛型認識前篇中的 Point 類用泛型優(yōu)化
class Point<T>{
private T x;
private T 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 Generics {
public static void main(String[] args) {
// TODO Auto-generated method stub
Point<Integer> point = new Point<Integer>();
point.setX(10);
point.setY(29);
System.out.println("打印坐標(biāo):"+
point.getX()+","+point.getY());
}
}
通過使用泛型的例子與上篇做相應(yīng)代碼比較可發(fā)現(xiàn)作谭,在創(chuàng)建對象初始化坐標(biāo)時比較方便,需要什么類型數(shù)據(jù)的坐標(biāo)鞋吉,直接在 <> 類加入相應(yīng)的類名就行鸦做。
- 指定多個泛型,只需在尖括號 <> 中用逗號“,”分開就行谓着。例如:
```
class Demo<T,K>{
private T take;
private K key;
}
泛型的構(gòu)造方法
- 構(gòu)造方法可以為類中的屬性初始化泼诱,那么如果類中的屬性通過泛型指定,又需要構(gòu)造方法來設(shè)置其內(nèi)容的時候赊锚,那么構(gòu)造方法的定語與普通類的構(gòu)造方法并無大同治筒,不需要像聲明類那樣指定泛型。
- 在上訴代碼 泛型類 Point 中加入構(gòu)造方法:
public Point(T x,T y){
this.x = x;
this.y = y;
}
- 在對象實例化時使用構(gòu)造方法:
```
Point<String> point1 = new Point<String>("經(jīng)度1","緯度2")舷蒲;
```
泛型 - 通配符
class Info<T>{
private T key;
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
@Override
public String toString(){
return this.getKey().toString();
}
}
public class Generics2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Info<String> info = new Info<String>();
info.setKey("Java學(xué)習(xí)");
read(info);
}
public static void read(Info<?> t) {
//這里用 耸袜?通配符代表任意類型,使用Object會出錯牲平,不寫<?>會有警告
System.out.println(t.toString());
}
}
泛型接口
- 泛型接口的創(chuàng)建于泛型類的創(chuàng)界并無大同堤框,只是將 class 變?yōu)?interface, 但是實現(xiàn)接口的類必須將接口的方法實現(xiàn)。
泛型方法
- 泛型方法與泛型類并沒有必然的聯(lián)系,泛型方法有自己的類型參數(shù)蜈抓,在普通類中也可以定義泛型方法启绰。泛型方法中的T1、T2與泛型類中的T1沟使、T2沒有必然的聯(lián)系酬土,也可以使用其他的標(biāo)識符來代替。
- 泛型方法中可以定義泛型參數(shù)格带,此時參數(shù)的類型就是傳入的數(shù)據(jù)類型
class Gener{
//泛型方法 返回一 T 類型的數(shù)據(jù)
public <T> T returnT(T t) {
return t;
}
}
public class Generics3 {
public static void main(String[] args) {
Gener gener = new Gener();
//泛型方法的調(diào)用方便傳入任意類型的數(shù)據(jù)
String str = gener.returnT("Java學(xué)習(xí)");
System.out.println(str);
int i = gener.returnT(10);
System.out.println(i);
}
}
泛型數(shù)組
- 在創(chuàng)建一個泛型方法時撤缴,也可以傳遞或者返回一個泛型數(shù)組
class Gener{
//傳遞一個泛型數(shù)組
public <T> void returnT(T t[]) {
for (int i = 0; i < t.length; i++) {
System.out.print(t[i]);
}
}
}
public class Generics3 {
public static void main(String[] args) {
Gener gener = new Gener();
String arr[] ={"Java","學(xué)","習(xí)"};
gener.returnT(arr);
}
}
泛型摩擦
- 如在定義某一個泛型類,在實例化過程中叽唱,沒有指明具體類型屈呕,那么就是自動擦除泛型類型。編譯器就將生成一種與泛型類同名的原始類棺亭,但是類型參數(shù)都被刪除了虎眨。
總結(jié) - 泛型的好處
- 類型安全
- 消除強制類型轉(zhuǎn)換
- 潛在性能收益