java泛型
1. 什麼是泛型?
2. 泛型到底是幹嘛的。
3. 使用泛型的好處。
4. 爲什麼使用泛型。
5. 泛型的基本用法。
6. 泛型的常見錯誤。
什麼是泛型:
什麼是泛型呢?剛開始接觸的時候我也還是不太明白,用官方的話他叫:“變量類型的參數化”,他是JDK1.5中一個重要的特性。通過引入泛型我們將獲得編譯時類型的安全和運行時更小的拋出ClassCastException的可能。
自己對泛型的理解:
人都是懶惰的,總想着一勞永逸,我們用類和方法,只能使用具體的類型,要麼是基本類型,要麼就是自己定義的類,這樣代碼的通用性很差,所以我們的前輩寫出了泛型。所以說:“懶人”成就了科技,讓我們的生活更加的智能化。
泛型到底是幹嘛的:
泛型最多且最典型的是用於集合中。
在沒有泛型的時候我們在集合存入的都是Object類型的數據,需要進行強制轉換轉換我們需要的類型。
比如:
import java.util.List;
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
List list=new LinkedList();
list.add(111);
boolean boo= list.get(0)>2000;注1;
}
}
這段代碼他會報錯1:The operator > is undefined for the argument type(s) Object, int(操作符>是未定義的參數類型(s)對象,int)。現在集合中的0下標值爲Object類型的,即使我們對他進行了強轉的處理,他會不進行報錯,但一樣會存在很多異常隱患,且集合中可以存儲很多個的類型,他做不到規範的讀取使用,這個時候就需要用到我們的泛型了。
package fanxingboke;
import java.util.List;
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
List <Integer>list=new LinkedList<Integer>();
list.add(111);
boolean boo= (int)list.get(0)>2000;
System.out.println(boo);
}
}
如上代碼,咱們在集合類後面加上<>尖括號裏面寫上數據類型,前後尖括號的值必須得一致。這樣咱們就能準確的規範咱們這個集合需要寫上什麼的數據,例如我上面泛型裏規定的是int類型,這個集合只能存儲int類型的數據,如果傳入不是泛型規定的類型,這段代碼就會報錯,你就能及時解決代碼的錯誤,就不會存在安全隱患。
這個咱就可以理解爲方法的傳參,聲明實例的時候就給泛型進行了規定,只能爲咱們規定的類型。
泛型也可以繼承如:
父類:
public class Parent<T1,T2>
{
private T1 variable1;
private T2 variable2;
public T1 getvariable1()
{
return variable1;
}
public void setFoo1(T1 variable1)
{
}
public T2 getvariable2()
{
return variable2;
}
public void setFoo2(T2 variable2)
{
}
}
子類:
public class Child<T1, T2, T3> extends Parent<T1, T2>
{
private T3 variable3;
public T3 getvariable3()
{
return variable3;
}
public void setFoo3(T3 variable3)
{
}
}
泛型也可以去實現接口,這個我都不細說了細說就有偏題跑到接口了,給大家留點想象的空間。
泛型的上限和下限:
設置泛型對象的上限使用extends,表示參數類型只能是該類型或該類型的子類:
聲明對象:類名<?extends 類> 對象名
定義類:類名<泛型標籤 extends 類>{}
設置泛型對象的下限使用super,表示參數類型只能是該類型或該類型的父類:
聲明對象:類名<?super 類> 對象名稱
定義類:類名<泛型標籤 extends類>{}
向下引用:
package fanxingboke;
import java.util.List;
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
F<? extends Object> f = new F<String>();// 這是聲明實例,向下引用聲明的時候<>裏必須爲extends他後面跟的必須是父級,後面泛型規定尖括號裏必須爲他的子類,也包括他本身。
f.D("這是向下引用");
}
}
class F<T> {//定義一個泛型類。
public void D(Object object) {
System.out.println(object);
}
}
向上引用:
package fanxingboke;
import java.util.List;
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
F<? super String> f = new F<Object>();// 這是聲明實例,向上引用聲明的時候<>裏必須爲關鍵字super他後面跟的必須是子級,後面泛型規定尖括號裏必須爲他的父類,也包括他本身。
f.D("這是向上引用");
}
}
class F<T> {//定義一個泛型類。
public void D(Object object) {
System.out.println(object);
}
手動滑稽 - -- - - -- - - -- -
歡迎大家來指點錯誤,更歡迎廣大碼農來討論喲。
最後給大家推薦一本書《站在鉅著之上談泛型》。