站長資訊網
最全最豐富的資訊網站

一起來理解Java中的泛型

本篇文章給大家帶來了關于java的相關知識,其中主要介紹了關于泛型的相關問題,包括了自定義泛型類、自定義泛型方法、自定義泛型接口等等內容,下面一起來看一下,希望對大家有幫助。

一起來理解Java中的泛型

推薦學習:《java視頻教程》

  • 泛型:是JDK5中引入的特性,可以在編譯階段約束操作的數據類型,并進行檢查。
  • 泛型的格式:<數據類型>,注意:泛型只能支持引用數據類型
  • 集合體系的全部接口和實現類都是支持泛型的使用的。

優點:

  • 統一數據類型。
  • 把運行的問題提前到編譯期間,避免了強制類型轉換可能出現的問題,因為編譯階段類型便可以確定下來。
public static void main(String[] args) {         List<String> list = new ArrayList<>();         list.add("石原里美");         list.add("工藤靜香");         list.add("朱茵");         for (String s : list) {             System.out.println(s);         }     } 輸出結果: 石原里美 工藤靜香 朱茵

并且泛型還可以在很多地方進行定義,比如在類后面就是泛型類、方法聲明上就是泛型方法、接口后面就是泛型接口。接下來我們共同來學習一下這些泛型是如何使用的:

自定義泛型類

概念

  • 定義類的同時定義了泛型的類就是泛型類。
  • 泛型類的格式:修飾符 class 類名<泛型變量> { }
public class MyArrayList<E>{    }
  • 作用:編譯階段可以指定數據類型,類似于集合的作用

實戰教學

現創建一個泛型類,實現基本的增加、刪除操作,以此來具體了解其用法:

//泛型類MyArrayLIst public class MyArrayLIst<E> {     public void add(E e){      }     public void remove(E e){      } } //main public static void main(String[] args) {         MyArrayLIst<String> list = new MyArrayLIst<>();         //通過對泛型的設定,實現對數據專一處理         list.add("石原里美");         list.add("工藤靜香");         list.remove("工藤靜香");     }

泛型類的原理:

把出現泛型變量的地方全部替換成傳輸的真實的數據類型。

通過認真觀察,其實不難去發現,泛型類與普通類的最大區別在于在調用方法的時候可以統一的對同一種數據進行處理,不會涉及到其他的數據類型,從一定程度上避免了強制類型轉化時可能會出現的問題。

一起來理解Java中的泛型

自定義泛型方法

概念

  • 定義方法的同時定義了泛型的方法就是泛型方法。
  • 泛型方法的格式:修飾符<泛型變量> 返回值類型 方法名(形參列表){ }
public <E> void view(E e){    }
  • 作用:方法中可以使用泛型接收一切實際類型的參數,方法更具備通用性。
  • 注意:泛型方法需要區別于泛型類中所定義的方法,雖然它們也在使用泛型,但是該泛型不是其定義的,而是泛型類定義的。

實戰教學

無論傳入何種類型的數組,都可以返回它的內容,即實現Arrays.toString()的作用

public static void main(String[] args) {         String [] name = {"石原里美","工藤靜香","朱茵"};         view(name);         Integer [] age = {18,19,20};         view(age);     }     public static  <T> void view(T[] arr){         StringBuilder list = new StringBuilder();         for (int i = 0; i < arr.length; i++) {             list.append(arr[i]).append("t");         }         System.out.println(list);     }

通過實現對泛型方法的定義,可以實現多種數據類型的接收,應用范圍更加廣泛。

自定義泛型接口

概念

  • 使用泛型定義的接口就是泛型接口。
  • 泛型接口的格式:public interface People<E>{ }
public interface People <E>{    }
  • 作用:泛型接口可以讓實現類選擇當前功能需要操作的數據類型

實戰教學

定義一個People接口,實現對老師Teacher類、學生Student等類的操作

//People接口 public interface People <E>{     void run(E e);     void height(E e); } //Student類 public class Teacher {  } //實現類Fantype public class Fantype implements People<Teacher> {      @Override     public void run(Teacher teacher) {      }      @Override     public void height(Teacher teacher) {      } }

通過對上述代碼的觀察,可以發現,People后定義的是什么類型,那么該實現類只能對該種數據類型進行操作,其他類型不可以進行此操作。

通配符和上下限

通配符

  • ?可以在“使用泛型”的時候代表一切類型
  • E T K V是在定義泛型的時候用的

假設現在有一場為學生和老師而舉辦的比賽,需要比較速度究竟誰更快,分別創建一定數量的對象并將其傳入集合之中。然而當我們將這兩個集合分別傳入方法中的時候,會發現,學生對象集合list2出現報錯,為什么呢?原因是因為數據類型不同,那么該如何使得兩種類型都可以傳入呢?或許這個時候就會有人說了:“既然兩個類都是People的子類,那么為什么不定義它的泛型是People呢?”這個想法很好,但是我們需要明確一點的是子類與父類雖然是有關系的,但是定義之后的集合是沒有關系的,所以這里是行不通的。

//main //老師對象集合 ArrayList<Teacher> list1 = new ArrayList<>(); list1.add(new Teacher()); list1.add(new Teacher()); pk(list1); //學生對象集合 ArrayList<Student> list2 = new ArrayList<>(); list2.add(new student()); list2.add(new student()); pk(list2);//由于pk方法的形參是泛型為Teacher的集合,所以會報錯 //父類 class People{      } //子類 class Teacher extends People{      } class student extends People{      } //pk方法: public static void pk(ArrayList<Teacher> people){ }

應對這個問題,我們可以便可以將本篇文章引入的知識“通配符”放在實際應用中解決問題了,通過其簡短的概念“?可以在‘使用泛型’的時候代表一切類型”就可以理解其作用了,這里我們可以使用“?”共同代表兩種類型。

public static void pk(ArrayList<?> people){ //通過通配符?便可以將這個問題解決掉     }

上下限

然而此時又出現一個問題,定義了一個dog類,試圖創建一些對象并傳入集合中混入比賽,這種當然情況當然是不允許發生的,然而?是可以表示任意類型的,并不能對其進行限制。因此上下限的作用就體現出來了:

  • 上限:<? extends 父類>,傳入類型必須是該父類或者是父類的子類
  • 下限:<? super 子類>,傳入類型必須是該子類或者是子類的父類
public static void pk(ArrayList<? extends People> people){ //通過上下限便可以將這個問題解決掉 //要求傳入的類型必須是People的子類才可以     }

推薦學習:《java視頻教程》

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
精品国产自在久久| 大伊香蕉精品一区视频在线| 亚洲精品无码av人在线观看| 91精品在线国产| 日韩欧美亚洲国产精品字幕久久久| 国产SUV精品一区二区88| 亚洲精品无码日韩国产不卡?V | 国产精品视频永久免费播放| 中日韩产精品1卡二卡三卡| 精品久久免费视频| 久久久久人妻一区精品| 日韩av无码中文字幕| 国产三级久久精品三级| 少妇AV射精精品蜜桃专区| 精品久久久久香蕉网| 正在播放国产精品每日更新 | 老司机91精品网站在线观看| 亚欧无码精品无码有性视频| 国产精品第一页爽爽影院| 久久精品2020| 国产成人精品实拍在线| 日韩精品国产另类专区| 亚洲av无码乱码国产精品| 一本色道久久88综合日韩精品| 少妇人妻偷人精品视频| 久久精品无码一区二区app| 亚洲国产精品无码第一区二区三区 | 久久久久人妻精品一区二区三区| 国产精品永久久久久久久久久| 亚洲日韩精品无码专区| 91久久精品国产91性色也| 日韩精品福利在线| heyzo亚洲精品日韩| 精品无码久久久久久午夜| 亚洲国产第一站精品蜜芽| 99久久国产宗和精品1上映| 国产精品国产国产aⅴ| 精品视频一区在线观看| 亚洲日韩中文字幕在线播放| 国内精品-bt天堂| 99久久国产综合精品swag|