我們為什麼要使用泛型? 在學習集合時,我們都知道集合中是可以存放任意對象的,只要把對象存儲集合後,那麼這時他們都會被提升成Object類型。當我們在取出每一個對象,並且進行相應的操作,這時必須採用向下類型轉換。這個時候就要註意了,很容易出現問題. public class GenericDemo { ...
我們為什麼要使用泛型?
在學習集合時,我們都知道集合中是可以存放任意對象的,只要把對象存儲集合後,那麼這時他們都會被提升成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
不知道使用什麼類型來接收的時候,此時可以使用?,?表示未知通配符,他和和Number、String、Integer一樣都是一種實際的類型,可以把?看成所有類型的父類。是一種真實的類型。
這時我們在操作類型時,不能使用類型的具體功能時,只能使用Object類中的功能。`
參考鏈接:https://www.cnblogs.com/coprince/p/8603492.html