成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解Java泛型之入門泛型必懂的知識點

開發 后端
今天我來講解第一個知識點:入門泛型必懂的知識點。先幫大家掃清泛型基礎概念的相關知識點,也歡迎大家持續關注我的后續文章。

 我相信,絕大多數初始Java泛型的同學都會感到這個知識點理解起來有些困難,在這里我會對java泛型相關知識點做一個詳細的介紹,包括:入門泛型必懂的知識點、通配符、泛型擦除以及泛型應用四個內容。今天我來講解第一個知識點:入門泛型必懂的知識點。先幫大家掃清泛型基礎概念的相關知識點,也歡迎大家持續關注我的后續文章。

[[406054]]

泛型定義

泛型的英文是 generics,generic 的意思是通用,而翻譯成中文,泛應該意為廣泛,型是類型。所以泛型就是能廣泛適用的類型。但泛型還有一種較為準確的說法就是為了參數化類型,或者說可以將類型當作參數傳遞給一個類或者是方法。我們通過兩個實例對比來了解使用泛型和好處。

1.不使用泛型的實例

  1. public class ValueDemo { 
  2.   Object value; 
  3.   public Object getValue() { 
  4.       return value; 
  5.   } 
  6.   public void setValue(Object value) { 
  7.       this.value = value; 
  8.   } 
  9.   public static void main(String[] args) { 
  10.       // TODO Auto-generated method stub 
  11.       ValueDemo demo = new ValueDemo(); 
  12.       demo.setValue(888); 
  13.       int value = (int) demo.getValue(); 
  14.       demo.setValue("hello"); 
  15.       String value1 = (String) demo.getValue(); 
  16.       System.out.println(value); 
  17.       System.out.println(value1);  
  18.   } 

2.使用泛型的實例

  1. public class ValueDemoT<T> { 
  2.       T value; 
  3.       public T getValue() { 
  4.         return value; 
  5.       } 
  6.       public void setValue(T value) { 
  7.         this.value = value; 
  8.       } 
  9.   public static void main(String[] args) { 
  10.       // TODO Auto-generated method stub 
  11.       ValueDemoT<Integer> demo = new ValueDemoT<Integer>(); 
  12.       demo.setValue(888); 
  13.       Integer value = demo.getValue(); 
  14.       ValueDemoT<String> demo1 = new ValueDemoT<String>(); 
  15.       demo1.setValue("hello"); 
  16.       String value1 = demo1 .getValue(); 
  17.       System.out.println(value); 
  18.       System.out.println(value1);  
  19.   } 

通過上面的例子我們可以發現使用泛型的好處主要有三點:

1.相對于Object 代替一切類型這種方式,泛型不再需要對取出來的結果進行強制轉換了!泛型使得數據的類型可以像參數一樣由外部傳遞進來,實現類型參數化。

2.泛型參數一旦確定好,如果類型不匹配,編譯器就不通過。如下圖所示:

這是一種類型安全檢測機制,一定程度上提高了軟件的安全性防止出現低級的失誤。

3.泛型提高了程序代碼的可讀性,不必要等到運行的時候才去強制轉換,在定義或者實例化階段,因為 ValueDemoT 這個類型顯化的效果,程序員能夠一目了然猜測出代碼要操作的數據類型。

泛型類、泛型方法和泛型接口

泛型按照使用情況可以分為 3 種。

  • 泛型類。
  • 泛型方法。
  • 泛型接口。

泛型類

  1. public class Demo<T> { 
  2.         T field1; 

實例化方法如下:

  1. Demo <String> demo1=new Demo <>(); 
  2. Demo <Integer> demo2 =new Demo<>(); 

泛型方法

泛型方法必須以進行聲明,其中包括有參方法和無參方法,具體代碼如下

  1. public class Demo { 
  2.  //無返回值的方法 
  3.   public <T> void testMethod1(T t){ 
  4.           //code 
  5.  //有返回值的方法 
  6.  public  <T> T testMethod2(T t){ 
  7. return null

泛型接口

泛型接口與泛型類的定義及使用基本相同,代碼如下:

  1. public interface DemoT<T> { 
  2.     public T test(); 

泛型上下邊界

在使用泛型的時候,我們還可以為傳入的泛型類型實參進行上下邊界的限制。

— 泛型的參數使用extends關鍵字表示參數只能接受類class和其子類。這里的class是上限。

— 泛型的參數使用super關鍵字表示參數只能接受類class和其父類。這里的class是下限。

使用的代碼如下:

  1. public class Vehicle { 
  2.   public void drive() {}; 
  3.   public void brake() {}; 
  4. public class Car extends Vehicle { 
  5.   public void drive() { 
  6.       System.out.println("car的drive方法"); 
  7.   }; 
  8.   public void brake() { 
  9.       System.out.println("car的brake方法"); 
  10.   }; 
  11. public class Benz extends Car{ 
  12.   public void drive() { 
  13.       System.out.println("benz drive"); 
  14.   }; 

定義一個泛型方法

  1. public class CarT { 
  2.   public static void main(String[] args) { 
  3.       getCar(new Benz()); 
  4.       getCar(new Car()); 
  5.       getCar(new Vehicle()); //IDE報錯 
  6.   } 
  7.   public static <T extends Car> void getCar(T car) { 
  8.       car.drive(); 
  9.   } 

可以看到方法getCar(T car) 中的參數只能傳入 Car類或者其子類的實例,而Car的父類Vehicle的實例則不能傳入!super的使用跟extends類似,這里就不再詳細講解了

泛型的注意點

1.泛型方法中的泛型參數與類的泛型參數沒有關聯,代碼如下:

  1. public class Demo1<T> { 
  2.   public <T> T testMethod1(T t){ 
  3.         return t; 
  4.   } 
  5.   public static void main(String[] args) { 
  6.       Demo1<String> demo=new Demo1<String> (); 
  7.       Integer i=demo.testMethod1(new Integer(123)); 
  8.       System.out.println(i); 
  9.   } 

可以看到Demo1和testMethod1(T t)可以賦值不同的類型,前者是String而后者是Integer。

2.出于規范的目的,泛型中的T 只是一種習慣性寫法,我們可以把替換為其他標識,例如。常見的其他約定寫法如下:

  • T 代表一般的任何類。
  • E 代表 Element 。
  • K 代表 Key 。
  • V 代表 Value,通常與 K 一起配合使用。

3.泛型可以有多個參數,我們以2個參數為例,代碼如下:

  1. public class ValueDemoT2<A,B> { 
  2.       A value1; 
  3.       B value2; 
  4.       public  void setValue(A p_value1,B p_value2) { 
  5.         value1 = p_value1; 
  6.         value2 = p_value2; 
  7.       } 
  8.   public static void main(String[] args) { 
  9.       ValueDemoT2<Integer,String> demo = new ValueDemoT2<Integer, String>(); 
  10.       demo.setValue(123456,"hello"); 
  11.       System.out.println(demo.value1); 
  12.       System.out.println(demo.value2);  
  13.   } 

執行代碼輸出:

  • 123456
  • Hello

4.泛型類或者泛型方法中,不接受 8 種基本數據類型。例如下面代碼則無法編譯通過

  1. List<int> li = new ArrayList<>(); 

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-06-18 08:25:42

Java泛型通配符

2021-07-01 06:47:30

Java泛型泛型擦除

2021-07-09 06:11:37

Java泛型Object類型

2022-06-19 22:54:08

TypeScript泛型工具

2017-11-14 14:41:11

Java泛型IO

2010-01-06 10:43:49

.NET Framew

2011-03-21 16:26:28

java泛型

2024-10-28 00:40:49

Go語法版本

2011-04-13 09:16:55

泛型

2021-03-01 07:34:42

Java泛型ArrayList

2021-09-29 18:17:30

Go泛型語言

2020-02-21 08:18:58

JavaScala編程語言

2024-10-22 16:59:07

2009-09-25 10:03:51

Java泛型

2009-07-30 14:00:21

ASP.NET 2.0

2017-03-06 16:51:52

Java泛型實現

2021-12-30 19:34:15

Java泛型JDK

2011-06-03 08:49:54

Java

2009-08-24 18:22:05

C# 泛型編程

2011-08-08 14:14:03

架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美日韩一区 | 九色在线| 视频精品一区二区三区 | 懂色av色香蕉一区二区蜜桃 | 国产一区二区在线视频 | 国产精品一区二区视频 | 亚洲精品乱码久久久久v最新版 | 隔壁老王国产在线精品 | 成人精品视频在线观看 | 亚洲精品电影在线观看 | 黄视频免费在线 | 精国产品一区二区三区四季综 | 国产极品车模吞精高潮呻吟 | www.玖玖玖 | 亚洲第一色av | 国产精品视频一区二区三 | 中文字幕在线免费 | 在线观看中文字幕 | 国产亚洲精品精品国产亚洲综合 | 免费黄色a视频 | 亚洲一区二区三区福利 | 国产97久久 | 国产三级电影网站 | 高清一区二区三区 | 亚洲国产欧美在线 | 免费av手机在线观看 | 成人二区 | 亚洲永久在线 | 国产一区二区精品在线观看 | 国产精品一区一区三区 | 中文字幕在线一区 | 99re在线视频免费观看 | 亚洲一区二区在线 | 亚洲精品视频在线看 | 99精品国产一区二区三区 | 精品乱码一区二区 | 国产欧美精品一区二区三区 | 久久精品在线 | 日韩av三区 | 国产精品久久精品 | 高清久久|