先上兩段程式碼:
public static <T> void show1(List<T> list){ for (Object object : list) { System.out.println(object.toString()); } } public static void show2(List<?> list) { for (Object object : list) { System.out.println(object); } }
可以看到show1方法中我們使用了T,大家都知道這是泛型的常見寫法,那麼這裡的T指的是某一類具體的對象,list集合裡只能存放相同類型數據,如果插入不同類型數據則會報錯。
那麼show2方法中我們使用的是? ,可以看到在void前面並沒有<t></t>
,?可以表示成佔位符,它自己也不知道list集合中會存放多少種類型的數據,所以這樣就表明我們的list中存放N種數據類型也是可以的。
我們透過一段測試程式碼來直觀的感受一下二者的區別吧:
public static void test(){ List<Student> list1 = new ArrayList<>(); list1.add(new Student("zhangsan",18,0)); list1.add(new Student("lisi",28,0)); list1.add(new Student("wangwu",24,1)); //这里如果add(new Teacher(...));就会报错,因为我们已经给List指定了数据类型为Student show1(list1); System.out.println("************分割线**************"); //这里我们并没有给List指定具体的数据类型,可以存放多种类型数据 List list2 = new ArrayList<>(); list2.add(new Student("zhaoliu",22,1)); list2.add(new Teacher("sunba",30,0)); show2(list2); }
來看看運行結果:
Student{name='zhangsan ', age=18, sex=0}
Student{name='lisi', age=28, sex=0}
Student{name='wangwu', age=24, sex=1}
************分割線**************
Student{name='zhaoliu', age=22, sex=1}
Teacher{name='sunba', age=30, sex=0}
#從show2方法可以看出和show1的區別了,list2存放了Student和Teacher兩種類型,同樣可以輸出數據,所以這就是T和?的區別啦~小夥伴們了解了吧
下面來看看?的延伸寫法:
List extends 資料型別> list
public static void show3(List<? extends Teacher> list) { for (Object object : list) { System.out.println(object); } }
List extends Teacher> list
這種寫法表示可以可以寫法表示可以#List extends Teacher> list這個寫法表示可以接收Teacher和它的子類別資料型別的list集合,寫個測試方法
show3(list2);
Student{name='zhaoliu', age=22, sex=1} Teacher{name='sunba', age=30, sex=0}
可以看到正常輸出,因為集合中的資料都是Teacher的子類別,如果我們將
List extends Teacher> list改成
List extends Student> list會出現什麼情況? 仔細看這張圖,我們新建了一個list3並且宣告資料型別為Teacher,這個時候呼叫
show3(List extends Student> list)
List super 資料型別> list
public static void show4(List<? super Student> list) { for (Object object : list) { System.out.println(object); } }可以看出來,我們接收的是Student及它父類別的集合,我們寫兩個集合資料然後呼叫試試看。
List list4 = new ArrayList<>(); list4.add(new Student("sunba",30,0)); list4.add(new Teacher("zhaoliu",22,1)); show4(list4);在list中插入了一個Student和Teacher對象,看看結果:
Student{name='sunba', age=30, sex=0} Teacher{name='zhaoliu', age=22, sex=1}沒毛病,正常運作並輸出。 下面我們來看看,如果我們是傳遞的Student的子類別的集合會咋樣
如果我定義List的時候沒有指定資料類型,並且插入了一個Child,Student,Teacher,還是呼叫
show4(List super Student> list)
以上是java泛型中佔位符T和?有哪些差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要整理了Stream流的概念和使用的相关问题,包括了Stream流的概念、Stream流的获取、Stream流的常用方法等等内容,下面一起来看一下,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver CS6
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具