激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 一篇文章帶你搞定JAVA泛型

一篇文章帶你搞定JAVA泛型

2021-10-08 01:27香菜聊游戲 Java教程

泛型是Java中的高級概念,也是構建框架必備技能,比如各種集合類都是泛型實現的,今天詳細聊聊Java中的泛型概念,希望有所收獲

1、泛型的概念

泛型的作用就是把類型參數化,也就是我們常說的類型參數

平時我們接觸的普通方法的參數,比如public void fun(String s);參數的類型是String,是固定的

現在泛型的作用就是再將String定義為可變的參數,即定義一個類型參數T,比如public static <T> void fun(T t);這時參數的類型就是T的類型,是不固定的

泛型常見的字母有以下:

? 表示不確定的類型
T (type) 表示具體的一個java類型
K V (key value) 分別代表java鍵值中的Key Value
E (element) 代表Element

這些字母隨意使用,只是代表類型,也可以用單詞。

 

2、泛型的使用

泛型有三種使用方式,分別為:泛型類、泛型接口、泛型方法。

類的使用地方是

方法的使用地方

  • Java泛型類
  • Java泛型方法
  • Java泛型接口
/**
* @author 香菜
*/
public class Player<T> {// 泛型類
  private T name;
  public T getName() {
      return name;
  }
  public void setName(T name) {
      this.name = name;
  }
}
 
public class Apple extends Fruit {
  public <T> void getInstance(T t){// 泛型方法
      System.out.println(t);
  }
}
 
public interface Generator<T> {
      public T next();
  }
 

 

3、泛型原理,泛型擦除

 

3.1 IDEA 查看字節碼

1、創建Java文件,并編譯,確認生成了class

一篇文章帶你搞定JAVA泛型

2、idea ->選中Java 文件 ->View

一篇文章帶你搞定JAVA泛型

 

3.2 泛型擦除原理

我們通過例子來看一下,先看一個非泛型的版本:

一篇文章帶你搞定JAVA泛型

從字節碼可以看出,在取出對象的的時候我們做了強制類型轉換。

下面我們給出一個泛型的版本,從字節碼的角度來看看:

一篇文章帶你搞定JAVA泛型

在編譯過程中,類型變量的信息是能拿到的。所以,set方法在編譯器可以做類型檢查,非法類型不能通過編譯。但是對于get方法,由于擦除機制,運行時的實際引用類型為Object類型。為了“還原”返回結果的類型,編譯器在get之后添加了類型轉換。所以,在Player.class文件main方法主體第18行有一處類型轉換的邏輯。它是編譯器自動幫我們加進去的。

所以在泛型類對象讀取和寫入的位置為我們做了處理,為代碼添加約束。

泛型參數將會被擦除到它的第一個邊界(邊界可以有多個,重用 extends 關鍵字,通過它能給與參數類型添加一個邊界)。編譯器事實上會把類型參數替換為它的第一個邊界的類型。如果沒有指明邊界,那么類型參數將被擦除到Object。

 

4、?和 T 的區別

?使用場景 和Object一樣,和C++的Void 指針一樣,基本上就是不確定類型,可以指向任何對象。一般用在引用。

T 是泛型的定義類型,在運行時是確定的類型。

 

5、super extends

通配符限定:

<? extends T>:子類型的通配符限定,以查詢為主,比如消費者集合場景

<? super T>:超類型的通配符限定,以添加為主,比如生產者集合場景

super 下界通配符 ,向下兼容子類及其子孫類, T super Child 會被擦除為 Object

extends 上界通配符 ,向下兼容子類及其子孫類, T extends Parent 會被擦除為 Parent

class Fruit {}
class Apple extends Fruit {}
class FuShi extends Apple {}
class Orange extends Fruit {}
import java.util.ArrayList;
import java.util.List;
public class Aain {
 public static void main(String[] args) {
       //上界
       List<? extends Fruit> topList = new ArrayList<Apple>();
       topList.add(null);
       //add Fruit對象會報錯
       //topList.add(new Fruit());
       Fruit fruit1 = topList.get(0);
       //下界
       List<? super Apple> downList = new ArrayList<>();
       downList.add(new Apple());
       downList.add(new FuShi());
       //get Apple對象會報錯
       //Apple apple = downList.get(0);
}

上界 <? extend Fruit> ,表示所有繼承Fruit的子類,但是具體是哪個子類,但是肯定是Fruit

下界 <? super Apple>,表示Apple的所有父類,包括Fruit,一直可以追溯到老祖宗Object 。

歸根結底可以用一句話表示,那就是編譯器可以支持向上轉型,但不支持向下轉型。具體來講,我可以把Apple對象賦值給Fruit的引用,但是如果把Fruit對象賦值給Apple的引用就必須得用cast。

 

6、注意點

 

1、靜態方法無法訪問類的泛型

一篇文章帶你搞定JAVA泛型

可以看到Idea 提示無法引用靜態上下文。

 

2、創建之后無法修改類型

List<Player> 無法插入其他的類型,已經確定類型的不可以修改類型

 

3、類型判斷問題

問題:因為類型在編譯完之后無法獲取具體的類型,所以在運行時是無法判斷類的類型。

我們可以通過下面的代碼來解決泛型的類型信息由于擦除無法進行類型判斷的問題:

/**
* 判斷類型
* @author 香菜
* @param <T>
*/
public class GenClass<T> {
   Class<?> classType;
   public GenClass(Class<?> classType) {
       this.classType = classType;
  }
   public boolean isInstance(Object object){
       return classType.isInstance(object);
  }
}

解決方案:我們通過在創建對象的時候在構造函數中傳入具體的class類型,然后通過這個Class對象進行類型判斷。

 

4、創建類型實例

問題:泛型代碼中不能new T()的原因有兩個,一是因為擦除,不能確定類型;而是無法確定T是否包含無參構造函數。

在之前的文章中,有一個需求是根據不同的節點配置實例化創建具體的執行節點,即根據IfNodeCfg 創建具體的IfNode.

/**
* 創建實例
* @author 香菜
*/
public abstract class AbsNodeCfg<T> {
   public abstract T getInstance();
}
public class IfNodeCfg extends AbsNodeCfg<IfNode>{
   @Override
   public IfNode getInstance() {
       return new IfNode();
  }
}
/**
* 創建實例
* @author 香菜
*/
public class IfNode {
}

解決方案:通過上面的方式可以根據具體的類型,創建具體的實例,擴展的時候直接繼承AbsNodeCfg,并且實現具體的節點就可以了。

 

7、總結

泛型相當于創建了一組的類,方法,虛擬機中沒有泛型類型對象的概念,在它眼里所有對象都是普通對象

一篇文章帶你搞定JAVA泛型

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://gamwatcher.blog.csdn.net/article/details/116406274

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 天天看成人免费毛片视频 | 成人性生活视频 | 午夜视频在线观看91 | 久久国产免费视频 | 毛片一区二区三区 | 未成年人在线观看 | 午夜精品福利影院 | 久久久大片 | 高清做爰免费无遮网站挡 | 亚洲综合精品成人 | 欧美性生交大片 | 国产精品亚洲一区二区三区在线观看 | 国产毛片视频 | 欧美精品一区自拍a毛片在线视频 | 国产噜噜噜 | mmmwww| 污片在线观看视频 | 国产精品久久久久久久久久久天堂 | av电影在线观看网址 | 国产在线免| 亚洲影视在线观看 | 久久久www视频 | bt 自拍 另类 综合 欧美 | 91高清在线免费观看 | jizzjizz中国少妇中文 | 羞羞视频免费网站 | 极品xxxx欧美一区二区 | v11av在线播放| 欧美成人免费看 | 欧美a级毛片 | 亚洲国产精品久久久久久久 | av黄色片网站 | 羞羞的视频免费在线观看 | 成人免费看片视频 | 久久久久久中文字幕 | 亚洲生活片| 成人在线视频一区 | 成人爱情偷拍视频在线观看 | 欧美大胆xxxx肉体摄影 | 精品久久久久久中文字幕 | 成年片在线观看 |