日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java 泛型】泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )

發布時間:2025/6/17 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java 泛型】泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、泛型擦除
  • 二、泛型的上界通配符 <? extends T>
  • 三、泛型的下界通配符 <? super T>





一、泛型擦除



泛型只保留到 編譯期 , 在 編譯完畢后 , 泛型就不存在了 ;

在運行時 , 通過反射 , 調用泛型類 , 即使違反了泛型規則 , 也能進行相關操作 , 這是因為 在運行時 , 已經沒有泛型相關的限制 , 泛型限制在編譯時就已經被擦除了 ;

但是 泛型的信息 , 保存在了常量表中 , 仍然可以獲取到 ;


泛型擦除 是為了 泛型可以兼容 老版本的 JDK 而設計的 ,

泛型是 JDK 5 加入的 , 如果添加了泛型 , 導致字節碼的格式改變 , 必然導致之前版本的 JDK 無法運行有泛型的字節碼程序 ;


給定一個 Demo.java 類 , 其中定義了一個 <T> T get() 方法 ;

public class Demo {public <T> T get(){T t = null;return t;} }

將其編譯后 , 查看字節碼附加信息 ;

D:\java>javap -v Demo.class Classfile /D:/java/Demo.classLast modified 2021-9-7; size 307 bytesMD5 checksum 727bc59421b23a5f0a31af0e91630ab8Compiled from "Demo.java" public class Demominor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER Constant pool:#1 = Methodref #3.#14 // java/lang/Object."<init>":()V#2 = Class #15 // Demo#3 = Class #16 // java/lang/Object#4 = Utf8 <init>#5 = Utf8 ()V#6 = Utf8 Code#7 = Utf8 LineNumberTable#8 = Utf8 get#9 = Utf8 ()Ljava/lang/Object;#10 = Utf8 Signature#11 = Utf8 <T:Ljava/lang/Object;>()TT;#12 = Utf8 SourceFile#13 = Utf8 Demo.java#14 = NameAndType #4:#5 // "<init>":()V#15 = Utf8 Demo#16 = Utf8 java/lang/Object {public Demo();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 1: 0public <T extends java.lang.Object> T get();descriptor: ()Ljava/lang/Object;flags: ACC_PUBLICCode:stack=1, locals=2, args_size=10: aconst_null1: astore_12: aload_13: areturnLineNumberTable:line 3: 0line 4: 2Signature: #11 // <T:Ljava/lang/Object;>()TT; } SourceFile: "Demo.java"

Demo 中的 get 方法類型返回值是 Ljava/lang/Object , 不是泛型 T , 這就是泛型在字節碼中被擦除了 ;

descriptor: ()Ljava/lang/Object;

執行下面的代碼 , 在運行時 , 使用反射 , 向 list1 集合中添加 int 類型的元素 , 添加成功 ; 說明在運行時 , 不再進行泛型檢查 , 即使不符合泛型要求 , 也能操作成功 ;

import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List;public class Main {public static void main(String[] args) {// 編譯器 在 編譯期 進行檢查List<String> list1 = new ArrayList<>();//list1.add(1);// 編譯器 在 編譯期 不進行檢查List list2 = new ArrayList<String>();//list2.add(1);try {Method method = ArrayList.class.getMethod("add", Object.class);method.invoke(list1, 1);System.out.println("list1 集合大小 : " + list1.size());} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}} }

執行結果 :





二、泛型的上界通配符 <? extends T>



泛型 上界通配符 : <T extends Person> 表示泛型 T 是 Person 的子類 , <? extends T> 泛型類型 只能是 T 的子類 ;

  • <T extends Person> 只能在聲明泛型時使用 , 不能在 使用 泛型 時使用 ;
public class Data<T extends Person> { }
  • <? extends T> 只能在使用 泛型 時使用 , 不能在聲明 泛型類/方法 時 使用 ;
Data<? extends Person> data6 = new Data<>();

333 個有繼承關系的類 :

public class Animal { } public class Person extends Animal { } public class Woman extends Person { }

泛型類 : 該泛型類接收一個泛型 , 該泛型 T 是 Person 的子類 ;

public class Data<T extends Person> { }

main 函數 :

// 上邊界通配符// 符合要求 , 可設置 Woman 的父類 , Woman 以及 Person 類Data<? super Woman> data4 = new Data<>();// 符合要求 , 可設置 Person 類Data<? super Person> data5 = new Data<>();// 不符合要求 , Animal 是最頂層的類 , 其取值都不符合 <T extends Person> 要求Data<? super Animal> data6 = new Data<>();

報錯信息 : 傳入不符合要求的泛型的報錯信息 ;





三、泛型的下界通配符 <? super T>



泛型 下界通配符 : <? super T> 泛型類型 只能是 T 的父類 ;

  • <? super T> 只能在使用 泛型 時使用 , 不能在聲明 泛型類/方法 時 使用 ;
Data<? super Person> data6 = new Data<>();

333 個有繼承關系的類 :

public class Animal { } public class Person extends Animal { } public class Woman extends Person { }

泛型類 : 該泛型類接收一個泛型 , 該泛型 T 是 Person 的子類 ;

public class Data<T extends Person> { }

main 函數 :

// 上邊界通配符// 符合要求 , 可設置 Woman 的父類 , Woman 以及 Person 類Data<? super Woman> data4 = new Data<>();// 符合要求 , 可設置 Person 類Data<? super Person> data5 = new Data<>();// 不符合要求 , Animal 是最頂層的類 , 其取值都不符合 <T extends Person> 要求//Data<? super Animal> data6 = new Data<>();

報錯信息 : 不符合要求 , Animal 是最頂層的類 , 其取值都不符合 要求

總結

以上是生活随笔為你收集整理的【Java 泛型】泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲国产精品成人综合在线 | 成人a网站| 亚洲成人av影片 | 精品国产一区三区 | 纯爱无遮挡h肉动漫在线播放 | 1000部多毛熟女毛茸茸 | 久久草视频 | 亚洲国产美女视频 | 国产成人精品一区二区三区在线观看 | 国产精品视频久久久 | 日本动漫艳母 | 国产精品天美传媒沈樵 | av影视天堂 | 操丝袜美女视频 | 国产www免费观看 | 在线观看日批 | 中国人妖和人妖做爰 | 日穴 | 久久午夜伦理 | 无码日韩人妻精品久久蜜桃 | 国产精品theporn88 | 午夜久久福利 | 国产精品久久久久久久久夜色 | 精品久久久久久久久久久久久久 | 日韩国产二区 | 国产乱码一区二区三区播放 | 成人午夜视频在线免费观看 | 极品美妇后花庭翘臀娇吟小说 | 亚洲性图一区二区三区 | 污片视频在线观看 | 天堂欧美城网站网址 | 精品亚洲一区二区三区 | 日韩精品一区二区三区网站 | 国产精品久久久久久久av | 黄色片hd | 黑丝少妇喷水 | 操穴网站 | 少妇被躁爽到高潮无码文 | 超碰首页 | 国产a√| 淫视频网站 | 精品国产视频一区二区 | 亚洲中文字幕久久无码 | 精品免费国产一区二区三区四区 | 极品videosvideo喷水| 成人男女视频 | 痴女扩张宫交脱垂重口小说 | 成人免费大片黄在线播放 | 老熟妇一区二区三区啪啪 | 在线精品视频一区 | 中文字幕1页 | 97欧美| 亚洲最新在线观看 | 国产自偷自拍 | 最新视频–x99av | 国产成人综合视频 | 免费无码又爽又黄又刺激网站 | 欧美va天堂 | 猫咪av在线 | 黄视频免费在线观看 | 国产精品成人69xxx免费视频 | 亚洲国产精彩中文乱码av | 天天摸天天看 | 羞羞软件 | 国产精品18 | 日韩精品一区二区三区色欲av | 麻豆美女视频 | 国产一区二区视频免费在线观看 | 亚洲乱码av | 一本在线免费视频 | 国产精品久久久久久久久久直播 | 丰满尤物白嫩啪啪少妇 | 亚洲第一成人网站 | 青青草婷婷 | 日韩三级a| 欧美交换国产一区内射 | 成人在线视频网址 | 精品一区二区视频 | 国产黄色片免费看 | 最新中文字幕av | 人妻换人妻a片爽麻豆 | 人妖一级片 | 日韩精品久久久久久久酒店 | 蜜桃视频在线入口www | 精品动漫3d一区二区三区免费版 | 在线午夜 | 看全黄大色黄大片美女人 | 中文在线字幕免费观看电 | 国产女主播av| 国产呦小j女精品视频 | 久久久精品中文字幕麻豆发布 | 欧美日本高清 | 亚色视频在线 | 午夜天堂| 一级黄色大片免费观看 | av黄色免费网站 | 喷潮在线| www色视频| 国产探花精品一区二区 |