詳解Java泛型之入門泛型必懂的知識點
我相信,絕大多數(shù)初始Java泛型的同學(xué)都會感到這個知識點理解起來有些困難,在這里我會對java泛型相關(guān)知識點做一個詳細(xì)的介紹,包括:入門泛型必懂的知識點、通配符、泛型擦除以及泛型應(yīng)用四個內(nèi)容。今天我來講解第一個知識點:入門泛型必懂的知識點。先幫大家掃清泛型基礎(chǔ)概念的相關(guān)知識點,也歡迎大家持續(xù)關(guān)注我的后續(xù)文章。
泛型定義
泛型的英文是 generics,generic 的意思是通用,而翻譯成中文,泛應(yīng)該意為廣泛,型是類型。所以泛型就是能廣泛適用的類型。但泛型還有一種較為準(zhǔn)確的說法就是為了參數(shù)化類型,或者說可以將類型當(dāng)作參數(shù)傳遞給一個類或者是方法。我們通過兩個實例對比來了解使用泛型和好處。
1.不使用泛型的實例
- public class ValueDemo {
- Object value;
- public Object getValue() {
- return value;
- }
- public void setValue(Object value) {
- this.value = value;
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- ValueDemo demo = new ValueDemo();
- demo.setValue(888);
- int value = (int) demo.getValue();
- demo.setValue("hello");
- String value1 = (String) demo.getValue();
- System.out.println(value);
- System.out.println(value1);
- }
- }
2.使用泛型的實例
- public class ValueDemoT<T> {
- T value;
- public T getValue() {
- return value;
- }
- public void setValue(T value) {
- this.value = value;
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- ValueDemoT<Integer> demo = new ValueDemoT<Integer>();
- demo.setValue(888);
- Integer value = demo.getValue();
- ValueDemoT<String> demo1 = new ValueDemoT<String>();
- demo1.setValue("hello");
- String value1 = demo1 .getValue();
- System.out.println(value);
- System.out.println(value1);
- }
- }
通過上面的例子我們可以發(fā)現(xiàn)使用泛型的好處主要有三點:
1.相對于Object 代替一切類型這種方式,泛型不再需要對取出來的結(jié)果進(jìn)行強制轉(zhuǎn)換了!泛型使得數(shù)據(jù)的類型可以像參數(shù)一樣由外部傳遞進(jìn)來,實現(xiàn)類型參數(shù)化。
2.泛型參數(shù)一旦確定好,如果類型不匹配,編譯器就不通過。如下圖所示:
這是一種類型安全檢測機制,一定程度上提高了軟件的安全性防止出現(xiàn)低級的失誤。
3.泛型提高了程序代碼的可讀性,不必要等到運行的時候才去強制轉(zhuǎn)換,在定義或者實例化階段,因為 ValueDemoT 這個類型顯化的效果,程序員能夠一目了然猜測出代碼要操作的數(shù)據(jù)類型。
泛型類、泛型方法和泛型接口
泛型按照使用情況可以分為 3 種。
- 泛型類。
- 泛型方法。
- 泛型接口。
泛型類
- public class Demo<T> {
- T field1;
- }
實例化方法如下:
- Demo <String> demo1=new Demo <>();
- Demo <Integer> demo2 =new Demo<>();
泛型方法
泛型方法必須以進(jìn)行聲明,其中包括有參方法和無參方法,具體代碼如下
- public class Demo {
- //無返回值的方法
- public <T> void testMethod1(T t){
- //code
- }
- //有返回值的方法
- public <T> T testMethod2(T t){
- return null;
- }
- }
泛型接口
泛型接口與泛型類的定義及使用基本相同,代碼如下:
- public interface DemoT<T> {
- public T test();
- }
泛型上下邊界
在使用泛型的時候,我們還可以為傳入的泛型類型實參進(jìn)行上下邊界的限制。
使用的代碼如下:
- public class Vehicle {
- public void drive() {};
- public void brake() {};
- }
- public class Car extends Vehicle {
- public void drive() {
- System.out.println("car的drive方法");
- };
- public void brake() {
- System.out.println("car的brake方法");
- };
- }
- public class Benz extends Car{
- public void drive() {
- System.out.println("benz drive");
- };
- }
定義一個泛型方法
- public class CarT {
- public static void main(String[] args) {
- getCar(new Benz());
- getCar(new Car());
- getCar(new Vehicle()); //IDE報錯
- }
- public static <T extends Car> void getCar(T car) {
- car.drive();
- }
可以看到方法getCar(T car) 中的參數(shù)只能傳入 Car類或者其子類的實例,而Car的父類Vehicle的實例則不能傳入!super的使用跟extends類似,這里就不再詳細(xì)講解了
泛型的注意點
1.泛型方法中的泛型參數(shù)與類的泛型參數(shù)沒有關(guān)聯(lián),代碼如下:
- public class Demo1<T> {
- public <T> T testMethod1(T t){
- return t;
- }
- public static void main(String[] args) {
- Demo1<String> demo=new Demo1<String> ();
- Integer i=demo.testMethod1(new Integer(123));
- System.out.println(i);
- }
- }
可以看到Demo1
2.出于規(guī)范的目的,泛型中的T 只是一種習(xí)慣性寫法,我們可以把替換為其他標(biāo)識,例如。常見的其他約定寫法如下:
- T 代表一般的任何類。
- E 代表 Element 。
- K 代表 Key 。
- V 代表 Value,通常與 K 一起配合使用。
3.泛型可以有多個參數(shù),我們以2個參數(shù)為例,代碼如下:
- public class ValueDemoT2<A,B> {
- A value1;
- B value2;
- public void setValue(A p_value1,B p_value2) {
- value1 = p_value1;
- value2 = p_value2;
- }
- public static void main(String[] args) {
- ValueDemoT2<Integer,String> demo = new ValueDemoT2<Integer, String>();
- demo.setValue(123456,"hello");
- System.out.println(demo.value1);
- System.out.println(demo.value2);
- }
- }
執(zhí)行代碼輸出:
- 123456
- Hello
4.泛型類或者泛型方法中,不接受 8 種基本數(shù)據(jù)類型。例如下面代碼則無法編譯通過
- List<int> li = new ArrayList<>();

























