[轉載] 詳解Java中的泛型

參考鏈接: Java中具有泛型的有界類型

1、什么是泛型?

?

泛型,即“參數化類型”。一提到參數,最熟悉的就是定義方法時有形參,然后調用此方法時傳遞實參。那么參數化類型怎么理解呢?顧名思義,就是將類型由原來的具體的類型參數化,類似于方法中的變量參數,此時類型也定義成參數形式(可以稱之為類型形參),然后在使用/調用時傳入具體的類型(類型實參)。?

2、一個小例子?

?

import java.util.ArrayList;

import java.util.List;

?

public static void main(String[] args) {

?

? ? ? ? List list = new ArrayList();

? ? ? ? list.add("hello");

? ? ? ? list.add("hallo");

? ? ? ? list.add(1);

? ? ? ? for (int i = 0; i < list.size(); i++) {

? ? ? ? ? ? String str = (String) list.get(i);

? ? ? ? ? ? System.out.println(str);

? ? ? ? }

? ? }

}?

上面的程序:? 編譯階段正常,而運行時會出現異常?

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String?

存在的問題:? 當把一個對象收入集合中,集合不會記住此對象的類型,當再次從集合中取出此對象時,對象變成了Object類型,但其運行時類型任然為其本身類型。強制轉換時,容易出現異常,正如程序中把Integer轉為String失敗。?

解決方法:? 通過使用泛型來使集合能夠記住集合內元素各類型?

將上面的代碼用泛型來實現?

import java.util.ArrayList;

import java.util.List;

?

public class Main {

? ? public static void main(String[] args) {

? ? ? ? List<String> list = new ArrayList<String>();

? ? ? ? list.add("hello");

? ? ? ? list.add("hallo");

? ? ? ? list.add(1);

? ? ? ? for (int i = 0; i < list.size(); i++) {

? ? ? ? ? ? String str = list.get(i);

? ? ? ? ? ? System.out.println(str);

? ? ? ? }

? ? }

}?

這時,編譯錯誤,無法運行?

Error:(13, 13) java: 對于add(int), 找不到合適的方法

? ? 方法 java.util.Collection.add(java.lang.String)不適用

? ? ? (參數不匹配; int無法轉換為java.lang.String)

? ? 方法 java.util.List.add(java.lang.String)不適用

? ? ? (參數不匹配; int無法轉換為java.lang.String)?

通過List,直接限定了list集合中只能含有String類型的元素,從而在取得集合中的元素時無須進行強制類型轉換,編譯器可以確定集合中存的都是String類型。?

3、泛型的特性?

?

Java中的泛型,只在編譯階段有效。?

在編譯過程中,正確檢驗泛型結果后,會將泛型的相關信息擦出,并且在對象進入和離開方法的邊界處添加類型檢查和類型轉換的方法。?

泛型信息不會進入到運行時階段。?

4、泛型的使用?

?

在泛型使用過程中,操作的數據類型被指定為一個參數,這種參數類型可以用在類、接口和方法中,分別被稱為泛型類、泛型接口、泛型方法。?

以幾個小例子來分析一下?

(1) 泛型類?

public class ArrayList<E>

extends AbstractList<E>

implements List<E>, RandomAccess, Cloneable, Serializable?

用泛型類聲明與建立對象?

ArrayList<String> list = new ArrayList<String>();?

JDK7之后可以寫成:?

ArrayList<String> list = new ArrayList<>();?

(2) 泛型接口?

...

public interface Comparator<T>{

? ? int compare(T o1, T o2);

? ? ...

}?

使用方法?

public class StringComparator implements Comparator<String>{

? ? @Override

? ? public int compare(String s1, String s2){

? ? ? ? return -s1.compareTo(s2);

? ? }

}?

(3) 泛型方法?

public static <T> T elemof(T[] objs,int index){

? ? return objs[index];

}?

使用方法?

public static String elemof(String[] objs,int index){

? ? return objs[index];

}?

5、泛型的上下邊界問題?

?

可以使用extends與super關鍵字、?類型通配符來限制泛型,并且可以結合這三者來模擬共變性與逆變性。?

共變性與逆變性?

如果B是A的子類,而Node< B >可視為一種Node< A >,則稱Node具有共變性(Covariance)或者有彈性的(Flexible)。?

如果B是A的子類,而Node< A >可視為一種Node< B >,則稱Node具有逆變性(Contravariance)。?

Java泛型不支持共變性與逆變性?

(1) 使用?與extends來模擬共變性?

class Fruit{}

class Apple extends Fruit{}

class RedApple extends Apple{}

?

List< ? extends Fruit > list1 = new ArrayList<Fruit>();

List< ? extends Fruit > list2 = new ArrayList<Apple>();

List< ? extends Fruit > list3 = new ArrayList<RedApple>();?

Fruit為上界,即List< ? extends Fruit >類型的對象可以引用持有Fruit及其子類的容器。?

關于一個add方法:?

void add(List< ? extends Fruit > list, Apple a){

? ? ?list.add(a);

}?

如果list引用的是持有RedApple類型的容器,那么將Apple類型向下轉型是不安全的,所以用List< ? extends Fruit >,add方法是受到限制的,即無法向容器中添加任何實際的類型除了null。?

(2) 使用?與super來模擬逆變性?

List< ? super RedApple > list4 = new ArrayList<RedApple>();

List< ? super RedApple > list5 = new ArrayList<Apple>();?

RedApple為下界,即List< ? super RedApple >類型的對象可以引用持有RedApple及其父類的容器。?

此時add方法是沒有限制的,但是也只能是添加Jonathan及其父類型。若事先不知道List< ? super RedApple >引用的對象所持有的類型,則可以做到向上轉型,而向上轉型是安全的。?

6、小結?

?

泛型的本質是:參數化類型?

只在編譯階段有效,泛型使用無錯誤時,擦出泛型的相關信息,并且在對象進入和離開方法的邊界處添加類型檢查和類型轉換的方法,泛型信息不會進入到運行時階段。?

泛型可以被用在類、接口和方法中,而且可以限制泛型的上下界。?

雖然Java泛型不支持共變性與逆變性,但是?與extends可模擬共變性;?與super可模擬逆變性。?

?

參考資料?

《Java學習筆記》 林信良?

Java泛型的邊界問題?

java 泛型詳解-絕對是對泛型方法講解最詳細的,沒有之一

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540387.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【初學者必讀】:前端工程師的知識體系

下圖是前端工程師圖解&#xff1a; 前端開發的核心是HTML CSS JavaScript。本質上它們構成一個MVC框架&#xff0c;即HTML作為信息模型&#xff08;Model&#xff09;&#xff0c;CSS控制樣式&#xff08;View&#xff09;&#xff0c;JavaScript負責調度數據和實現某種展現邏…

[轉載] Java面試題大全(2020版)

參考鏈接&#xff1a; Java中的循環 發現網上很多Java面試題都沒有答案&#xff0c;所以花了很長時間搜集整理出來了這套Java面試題大全&#xff0c;希望對大家有幫助哈~ 本套Java面試題大全&#xff0c;全的不能再全&#xff0c;哈哈~ 博主已將以下這些面試題整理成了一個…

使用Prometheus監控Cloudflare的全球網絡

Matt Bostock在SRECON 2017歐洲大會的演講中&#xff0c;介紹了如何使用Prometheus實現對CloudFlare分布于全球的架構和網絡的監控。Prometheus是一種基于度量進行監控的工具&#xff0c;CloudFlare是一家CDN、DNS和DDoS防御&#xff08;Mitigation&#xff09;服務提供商。\\基…

[轉載] Java-forEach增強for循環是值傳遞規則詳解

參考鏈接&#xff1a; Java中的for-each循環 1. 引入 正如Java語法意義&#xff0c;變量的傳遞只有值傳遞&#xff0c;雖然變量分為引用變量和基本類型變量&#xff0c;前者更像C中的地址概念。 在學習Lambda表達式的時候&#xff0c;遇到了試圖在增強for循環中對原鏈表元素重…

開始吧

2019獨角獸企業重金招聘Python工程師標準>>> 寫C三年有余&#xff0c;在技術方面也算小有所成。準備在這里分享一些C進階、Python、Golang技術文章。 CSDN博客地址&#xff1a; http://blog.csdn.net/godmaycry 以后博客同步更新。 轉載于:https://my.oschina.net/u…

[轉載] 常用應屆生Java開發筆試面試題(更新中)

參考鏈接&#xff1a; Java中的循環的重要事項 Java開發面試題 Java基礎篇Java8大基本數據類型Java的三大特性面向對象如果讓你推銷一款Java產品&#xff0c;你會怎么推銷呢&#xff1f;&#xff08;java的特點&#xff09;JVM與字節碼JDK與JREStringBuilder和StringBuffer的區…

java/javascript 時間操作工具類

一、java 時間操作工具類 import org.springframework.util.StringUtils;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List;/*** 時間操作工具類** author zwq**/ public …

[轉載] java語言程序設計-基礎篇

參考鏈接&#xff1a; Java中的決策制定(if&#xff0c;if-else&#xff0c;switch&#xff0c;break&#xff0c;continue&#xff0c;jump) 第1章&#xff0c;計算機、程序和Java概述 包括【每個java初學者都應該搞懂的問題】 http://blog.csdn.net/haobo920/article/detai…

Exchange server 2013(十四)WSUS部署及組策略設置(2)

我們繼續上一節未完的博客&#xff0c;繼續我們的WSUS設置。[上一章節標題&#xff1a;Exchange server 2013(十四)WSUS部署及組策略設置(1) 網址&#xff1a;http://1183839.blog.51cto.com/blog/1173839/1182366] 首先單擊自動審批,來修改審批規則,也就是說當wsus偵測到新的更…

[轉載] Python中的switch語句的替代品

參考鏈接&#xff1a; Java中的switch語句 Python 中沒有 switch語句。 一般用if-else 語句可以替代switch語句&#xff0c;今天學習了使用字典的映射來代替switch語句。Mark一下 day 8; def get_sunday(): return sunday def get_monday(): return monday def get_tues…

“□” 表情無法在 Android 設備顯示? 快試試 EmojiCompact 表情兼容庫

有了支持庫 v26 下的 Compact 庫&#xff0c;基于 API 19 及更高版本開發的應用就能獲得 emoji 的向下兼容&#xff0c;再也不會看到顯示失敗的 “豆腐塊” 啦。如要使用 EmojiCompact&#xff0c;需要在應用啟動時通過下載或者打包字體來初始化庫。通過集成小插件&#xff0c;…

[轉載] jstl獲取Parameter參數及switch使用

參考鏈接&#xff1a; Java中的字符串使用switch <% taglib uri"/WEB-INF/tld/c.tld" prefix"c" %> param 獲取 Parameter參數 <c:choose> <c:when test"${empty param.name}"> Please enter your name. …

syslinux 制作多系統啟動U盤

syslinux 制作多系統啟動U盤標簽&#xff1a;u盤使用 syslinux 制作多系統啟動U盤 syslinux 能加載虛擬內存盤&#xff0c;能引導各種鏡像文件&#xff0c;適合用于制作多系統啟動U盤&#xff0c; 但是我按照網上說的步驟&#xff0c;總是不能制作成功&#xff1a; 1. 格式化…

[轉載] JAVA基礎----java中E,T,?的區別?

batch_size 1 layout "NHWC" target tvm.target.Target("cuda") dtype "float32" log_file "%s-%s-B%d.json" % (network, layout, batch_size)

用MATLAB結合四種方法搜尋羅馬尼亞度假問題

選修了cs的AI課&#xff0c;開始有點不適應&#xff0c;只能用matlab硬著頭皮上了&#xff0c;不過matlab代碼全網僅此一份&#xff0c;倒有點小自豪。 一、練習題目 分別用寬度優先、深度優先、貪婪算法和 A*算法求解“羅馬利亞度假問題”。具體地圖我這里不給出了&#xff0c…

[轉載] Java中文與ASCII碼的轉換

參考鏈接&#xff1a; 擴展Java中的原始轉換 今天在研究Java中編碼的時候&#xff0c;看到了Java中ascii碼的強大。寫了一個CoderUtils.java&#xff0c;以后會擴展它。 package com.xingxd.study.test; import java.io.File; import java.io.FileWriter; import java.io.I…

[轉]Paul Adams:為社交設計

為社交設計 Strong, Weak, and Temporary Ties by Paul Adams on 2010/04/09 PS&#xff1a;作者Paul Adams Facebook全球品牌體驗總監 電話和手機聚集十億用戶用了15年的時間&#xff0c;而Facebook只用了9個月。我們看到越來越多的人開始用在線社交網絡&#xff0c;這種網絡好…

[轉載] Java中日期格式轉換

參考鏈接&#xff1a; Java中的類型轉換和示例 Code: /** * 字符串轉換為java.util.Date<br> * 支持格式為 yyyy.MM.dd G at hh:mm:ss z 如 2002-1-1 AD at 22:10:59 PSD<br> * yy/MM/dd HH:mm:ss 如 2002/1/1 17:55:00<br> * yy/MM/dd HH:…

Android Framework中的Application Framework層介紹

Android的四層架構相比大家都很清楚&#xff0c;老生常談的說一下分別為&#xff1a; Linux2.6內核層&#xff0c;核心庫層&#xff0c;應用框架層&#xff0c;應用層。我今天重點介紹一下應用框架層Framework。 Framework層為我們開發應用程序提供了非常多的API&#xff0c;我…

[轉載] java注釋

參考鏈接&#xff1a; Java注釋 Java注釋 java中注釋有三種&#xff1a;這些都稱之為java doc標記&#xff0c;含義如下&#xff1a; java中注釋有三種&#xff1a; 單行注釋 //注釋的內容&#xff0c;多行注釋 /…注釋的內容…/&#xff0c;文檔注釋 /**…注釋的內容….*/。…