我們為什么要使用泛型?
在學習集合時,我們都知道集合中是可以存放任意物件的,只要把物件存盤集合后,那么這時他們都會被提升成Object型別,當我們在取出每一個物件,并且進行相應的操作,這時必須采用向下型別轉換,這個時候就要注意了,很容易出現問題.
public class GenericDemo {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("abc");
coll.add("itcast");
coll.add(5);//由于集合沒有做任何限定,任何型別都可以給其中存放
Iterator it = coll.iterator();
while(it.hasNext()){
//需要列印每個字串的長度,就要把迭代出來的物件轉成String型別
String str = (String) it.next();
System.out.println(str.length());
}
}
}
運行時會出現一下例外.

也就是說我們雖然可以向集合中存放任意型別,但是對他進行相應方法的呼叫時,必須把他向下轉成以前的型別.
那么要我們顯然來記憶我們存了什么型別進去是不靠譜的 ,怎么來解決這個問題呢?
在JDK5之后,新增了泛型(Generic)語法,我們可以指定類或方法支持泛型,這樣我們對一個集合就只能存進去對應泛型的型別了(這個泛型可以直接確定是什么確定的類,也可以預支地使用未知的型別,).并且編譯時期就可以進行語法檢查.
泛型:可以在類或方法中預支地使用未知的型別,我們在創建物件時,將未知的型別確定具體的型別,
泛型可以用到類、介面和方法中,分別被稱為泛型類、泛型介面、泛型方法,
1.泛型類
//代表泛型的變數可以隨便定義,一般用 T,K,E...
修飾符 class 類名<代表泛型的變數> { }
class ArrayList<E>{
public boolean add(E e){ }
public E get(int index){ }
....
}
2.含有泛型的方法
public class MyGenericMethod {
public <T> void show(T t) {
System.out.println(t.getClass());
}
public <T> T show2(T t) {
return t;
}
}
注意:
2.1.呼叫方法時,確定泛型的型別,傳遞的是什么型別的引數,泛型就是什么型別
2.2. public 與 回傳值中間的<.T>非常重要,可以理解為宣告此方法為泛型方法,只有宣告了<.T>的方法才是泛型方法,泛型類和介面中的使用了泛型的成員方法并不是泛型方法.
3.含有泛型的介面
修飾符 interface介面名<代表泛型的變數> { }
public interface MyGenericInterface<E>{
public abstract void add(E e);
public abstract E getE();
}
3.1何時確定泛型的型別呢?
(1)、定義實作類時確定泛型的型別,此時就會重寫介面中的方法.
public class MyImp1 implements MyGenericInterface<String> {
@Override
public void add(String e) {
// 省略...
}
@Override
public String getE() {
return null;
}
}
(2)、始終不確定泛型的型別,直到創建物件時,確定泛型的型別
public class MyImp2<E> implements MyGenericInterface<E> {
@Override
public void add(E e) {
// 省略...
}
@Override
public E getE() {
return null;
}
}
public class GenericInterface {
public static void main(String[] args) {
MyImp2<String> my = new MyImp2<String>();
my.add("aa");
}
}
4.泛型的通配符
`
為什么出現呢?
這是因為泛型不存在繼承關系 Collection
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/142934.html
標籤:Java
上一篇:Java常用類-String類
下一篇:生產者消費者問題總結
