JAVA 泛型 學習筆記

2021-08-08 05:59:44 字數 3059 閱讀 3791

首先為了方便下面**的理解,這裡先提一下一些下面會用到的三個物件:person、studentworker

person的屬性只有string型別的name和int型別的age,其他就是一些基本的方法

student和worker都是完全繼承person類,都沒有新的屬性

下面開始正題

泛型,字面上理解是乙個廣泛的型別。

在jdk1.4版本之前,容器什麼型別的物件都可以儲存。但是在取出時,需要用到物件的持有內容時,需要做向下轉型。但是物件的型別不一致,導致了向下轉型發生了classcastexception異常。為了避免這個問題,只能主觀上控制,往集合中儲存的物件型別保持一致。

jdk1.5以後解決了這個問題,在定義集合時,就直接明確集合中儲存元素 的具體型別。這樣,編譯器在編譯時,就可以對集合中儲存的物件型別進行檢查。一旦發現型別不匹配,就編譯失敗。這個技術就是泛型技術。

以下是乙個例子

public static void main(string args) 

}

這裡的就是泛型的表示

注:這裡額外提醒int的型別的要寫integer

所以泛型具有以下優點

1:將執行時期的問題轉移到了編譯時期,可以更好的讓程式設計師發現問題並解決問題

2:避免了向下轉型的麻煩

總結:泛型就是應用在編譯時期的一項安全機制

那麼泛型是如何作用的呢?

泛型的擦除:編譯器通過泛型對元素型別進行檢查,只要檢查通過,就會生成class檔案,但在class檔案中,就將泛型標識去掉了

泛型的表現:泛型技術在集合框架中應用的範圍很大。

什麼時候需要寫泛型呢?1:只要看到類,或者介面在描述的時候右邊定義<>,就需要泛型。其實是,容器在不明確操作元素的型別的情況下,對外提供了乙個引數<>。使用容器時,只要將具體的型別實參傳遞給該引數即可。簡單來說,泛型就是,傳遞型別引數。

泛型類:jdk1.4時,型別向上抽取,當要操作的物件型別不確定的時候,為了擴充套件,可以使用object型別來完成,但是這種方式有一種弊端,就是向下轉型容易在執行時期發生classcastexception。因此,jdk1.5以後,新的解決方案來了。就是型別不確定時,可以對外提供引數。有使用者通過傳遞引數的方式完成型別的確定。如下列例子,util就是乙個泛型類

public class genericdemo4 

}class util

public final void setobj(w obj)

}

泛型方法:

public class genericdemo5 

}class demo

public static void staticshow(a a)

public void print(q w)

}

泛型介面:

public class genericdemo6 

}inte***ce inter

//這是第一種用到介面的類,明確了型別是string

class interimpl1 implements inter

}//這是第二種用到介面的類,沒有明確型別,所以還是用的泛型。型別在他的子類subdemo上定義

class interimpl2implements inter

}class subdemo extends interimpl2{}

萬用字元:

在不明確具體型別的情況下,可以使用萬用字元「?」來表示

public class genericdemo7 

private static void printcollection(collection<?> coll)

}}

限定

? extends e:接受e型別或者e的子型別,也就是限定了上限

? super e:接受e型別或者e型別的父型別,也就是限定了下限

(1)上限應用

public class genericdemo9 	}}

class mytreeset

mytreeset(collection<? extends e> c){}

}

(2)下限應用

public class genericdemo10 

};treesetts=new treeset(comp);

ts.add(new student("abc1",21));

ts.add(new student("abc2",28));

ts.add(new student("abc3",23));

ts.add(new student("abc4",25));

treesetts2=new treeset(comp);

ts2.add(new worker("abc1",51));

ts2.add(new worker("abc2",58));

ts2.add(new worker("abc3",53));

ts2.add(new worker("abc4",55));

for(iteratorit=ts.iterator();it.hasnext();)

for(iteratorit=ts2.iterator();it.hasnext();) }}

class youtreeset

}

這裡可以看出,無論是ts還是ts2,他們的父類都是person,所以比較方法用person為型別時,可以被他們使用

Java學習筆記 泛型

注 這裡只簡單介紹了一下泛型最基礎的使用,泛型功能很強大,為了趕課程,關於通用型別部分過後補上。別被我的筆記所誤導 課程中的泛型首先是由泛型集合開始入手的。由前邊的兩個集合arraylist和hashmap可以看出,在使用方便的同時也帶來了很多問題。1,效率低下,集合都是object的型別,使用是需...

java 泛型學習筆記

首先我對泛型的理解就是可以把任何object的子類當做類中的型別,下面是對於泛型的基本定義 public class generict public object getfoo 然後對於泛型 可以有兩個型別或者更多 public class generictt public void setfoo1...

Java學習筆記 泛型

一看到泛型就想到一對尖括號?jdk5以後的jdk的集合中就經常使用,例如collectioncollections 然而jdk5中剛剛出現集合框架的時候,集合框架中的變數都是object,因為系統不知道使用者要使用什麼型別的變數。自從jdk5後,引入了 引數化型別 parameterized typ...