Java05泛型

12 泛型

12.1 為什么使用泛型

泛型程序設計(Generic programming):意味著編寫的代碼可以被很多不同類型的對象所重用。

類型參數(type parameters

通配符類型(wildcard type) 可以將Manager添加到ArrayList<Employee>中,但不能把Employee添加到ArrayList<Manager>中。

?

12.2 定義簡單泛型類

一個泛型類(Generic class)就是具有一個或多個類型變量的類。

public class Pair<T, U>{...}

類型變量用大寫形式,且比較短。

?

Java庫中,E表示集合的元素類型;KV分別表示關鍵字和值的類型;TUS表示任意類型。

?

泛型類可看做普通類的工廠。

?

12.3 泛型方法

可以定義一個帶有類型參數的簡單方法,這個方法可以在普通類中,也可以在泛型類中。

類型變量T放在修飾符和返回類型之間。

當調用泛型方法時,在方法名前的尖括號中放入具體的類型。

也可以不放具體類型,編譯器會進行類型推斷。

class ArrayAlg
{public static <T> T getMiddle(T ... a){return a[a.length / 2];}
}String middle = ArrayAlg.<String>getMiddle( “John”, “Q”, “Public”);
String middle = ArrayAlg.getMiddle( “John”, “Q”, “Public”);


12.4 類型變量的限定

public static <T extends Comparable> T min(T[] ?a) { ... }

public static <T extends Comparable & Serializable> T min(T[] ?a) { ... }

?

限定中至多有一個類,且必須放在限定列表中的首位。

?

12.5 泛型代碼和虛擬機

虛擬機沒有泛型類型對象--所有對象都屬于普通類。

定義一個泛型類型時,都自動提供了一個相應的原始類型(raw type)。

原始類型的名字就是刪去類型參數后的泛型類型名。

擦除(erased)類型變量,替換為限定類型(無限定類型用Object)。

泛型方法同上。

?

這是與C++模板最大的區別,C++每個模板的實例化產生不同的類型,這一現象稱為“模板代碼膨脹”。

?

小結:

·虛擬機中沒有泛型,只有普通的類和方法;

·所有的類型參數都用它們的限定類型替換;

·橋方法被合成來保持多態;

·為保持類型安全性,必要時插入強制類型轉換。

?

橋方法位于聲明類型的泛型類中:

public void setSecond(Object second) { setSecond((Data) second)};

public Data getSecond{ return (Date) super.getSecond().clone();}

?

12.6 約束與局限性

1、不能用基本類型實例化類型參數;

?

2、運行時類型查詢只適用于原始類型。

虛擬機中的對象總有一個特定的非泛型類型,因此,所有的類型查詢只產生原始類型。

if (a instanceof Pair<String>) //ERROR

if (a instanceof Pair<T>) //ERROR

Pair<String> p = (Pair<String>) a; //WARNING--can only test that a is a Pair.

無論何時使用instanceof或涉及泛型類型的強制類型轉換表達式都會看到一個編譯器警告。

?

同理,getClass方法總是返回原始類型。

Pair<String> stringPair = ...;

Pair<Emloyee> employeePair = ... ;

if (stringPair.getClass() == employeePair.getClass()) //they are equal

//兩次調用getClass都將返回Pair.class

?

3、不能實例化參數化類型數組;

Pair<String>[] table = new Pair<String>[10]; // ERROR

ArrayList<Pair<String>> table = new ArrayList<Pair<String>>(); //RIGHT


4、向參數個數可變的方法傳遞一個泛型類型的實例:

public static <T> void addAll( Collection<T> coll, T ... ts)

實際上ts是一個數組,這違反了3,但此時規則有些放松,只會得到警告。

可用@SafeVarargs來消除警告。

或者@SuppressWarnings(“unchecked”)來抑制警告

?

5、不能實例化類型變量;

不能使用new T(...); ?new T[...]; ?T.class

可以這樣用

public static <T> Pair<T> makePair(Class<T> c1)
{try { return new Pair<>( c1.newInstance(), c1.newInstance())}catch (Exception ex) { return null;}
}

Class類本身就是泛型,String.class是一個Class<String>的實例。

?

6、禁止使用帶有類型變量的靜態域和方法;

?

7、不能拋出或捕獲泛型類的實例;

?

12.7 泛型類型的繼承規則

無論ST有什么關系,Pair<S> Pair<T>都沒什么關系。

泛型類可以擴展或實現其他的泛型類。這一點與普通的類沒有什么區別。

?

12.8 通配符類型

? 通配符。也可以理解為占位符。

? extends E: 可以接收E類型或者E的子類型。上限

? super E: 可以接收E類型或者E的父類型。下限 ?用的比較少,見集合的比較器

?

Pair<? extends Employee> 子類型限定

Pair<? super Manager> 超類型限定

?

Pair<Manager>Pair<? extends Employee>的子類型

Pair<Employ>Pair<? super Manager>的子類型

?

12.9 反射和泛型

Class類是泛型的。

使用反射API可以確定:

·類型參數T

·子類型限定

·通配符參數

·超類型限定

·參數為泛型

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

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

相關文章

bitmap轉換為drawable

Bitmap bitmap MediaStore.Images.Media.getBitmap(this, Uri.parse(string)); Drawable drawable new BitmapDrawable(bitmap);// 這樣就轉換成drawable格式&#xff0c;可以設置背景圖片了轉載于:https://www.cnblogs.com/Nigeria/p/10471028.html

numpy的下載與安裝教程——(解決No module named numpy問題)

NumPy函數庫是Python開發環境的一個獨立模塊&#xff0c;而且大多數Python發行版沒有默認安裝NumPy數據庫&#xff0c;因此在安裝Python之后必須單獨安裝NumPy數據庫。 進入Python shell開發環境后輸入 [python] view plaincopy from numpy import* 如果出現No module named …

Xception

The First ColumnThe Second Columnpadding 方式&#xff1a;same and valid The First ColumnThe Second ColumnSame 就是 增加一列相同的數 &#xff08;一般是0&#xff09;valid只保留有效的轉載于:https://www.cnblogs.com/hugeng007/p/10477430.html

1.蒼穹外賣-day01

蒼穹外賣-day01 課程內容 軟件開發整體介紹 蒼穹外賣項目介紹 開發環境搭建 導入接口文檔 Swagger 項目整體效果展示&#xff1a; 管理端-外賣商家使用 用戶端-點餐用戶使用 當我們完成該項目的學習&#xff0c;可以培養以下能力&#xff1a; 1. 軟件開發整體介紹 作為一名…

7 用戶和用戶組

7.1 用戶配置文件 7.1.1 用戶信息文件 /etc/passwd man 5 passwd 查看配置文件功能 第1字段&#xff1a; 用戶名稱 第2字段&#xff1a; 密碼標志 X代表有密碼 如果用戶沒有密碼&#xff0c;則只允許本地登錄 第3字段&#xff1a; UID&#xff08;用戶ID&#xff09; 0…

C#調用Python模塊

編程&#xff1a;C#調用Python模塊 當下&#xff0c;C#與Python都是比較熱門的計算機編程語言&#xff0c;他們各有優缺點&#xff0c;如果能讓他們互相配合工作&#xff0c;那是多么美好的事情&#xff0c;今天我來講解一下如何利用C#來調用Python。 如果讓C#支持調用Python模…

面試簡單整理之克隆

61.為什么要使用克隆&#xff1f; 克隆獲取對象的副本&#xff0c;直接用復制還是一個引用。 62.如何實現對象克隆&#xff1f; 1.被clone的類實現cloneable接口&#xff0c;重寫object類的clone&#xff08;&#xff09;方法 2.如果深克隆則克隆對象的引用對象也要實現接口、重…

8 權限管理

8.1 ACL權限 8.1.1 簡介與開啟 用于解決身份不夠用的問題 ACL(access control list) 訪問控制表 ACL是存在于計算機中的一張表&#xff0c;它使操作系統明白每個用戶對特定系統對象&#xff0c;例如文件目錄或單個文件的存取權限。 這張表對于每個系統用戶有擁有一個訪問…

windows下GitHub的SSH Key 配置

https://www.jianshu.com/p/9317a927e844轉載于:https://www.cnblogs.com/lishidefengchen/p/10481889.html

PyCharm調試錯誤

JetBrains PyCharm 2017.3.2 這就說明python.exe的環境沒有配&#xff0c;點擊藍色的configure Python Interpreter&#xff0c;然后選擇對應的路徑就可以了

Java06集合

13 集合 實現方法時&#xff0c;不同的數據結構會導致性能有很大差異。 13.1 集合接口 Java集合類庫將接口&#xff08;interface&#xff09;與實現&#xff08;implementation&#xff09;分離。 可以使用接口類型存放集合的應用&#xff0c;一旦改變了想法&#xff0c;可…

Tensorflow驗證碼識別應用

簡單的Tensorflow驗證碼識別應用&#xff0c;供大家參考&#xff0c;具體內容如下 1.Tensorflow的安裝方式簡單,在此就不贅述了. 2.訓練集訓練集以及測試及如下(純手工打造,所以數量不多): 3.實現代碼部分(參考了網上的一些實現來完成的) main.py(主要的神經網絡代碼) ?123456…

9 文件系統管理

9.1 回顧分區和文件系統 分區類型 主分區&#xff1a;總共最多只能分四個 擴展分區&#xff1a;只能有一個&#xff0c;主分區加擴展分區最多有四個&#xff0c;必須再劃分成邏輯分區才能使用。 邏輯分區&#xff1a;在擴展分區中劃分的 IDE硬盤最多支持59個邏輯分區 SCSI…

Linux 桌面玩家指南:09. X Window 的奧秘

Linux 桌面玩家指南&#xff1a;09. X Window 的奧秘 原文:Linux 桌面玩家指南&#xff1a;09. X Window 的奧秘特別說明&#xff1a;要在我的隨筆后寫評論的小伙伴們請注意了&#xff0c;我的博客開啟了 MathJax 數學公式支持&#xff0c;MathJax 使用$標記數學公式的開始和結…

Storm教程1理論介紹

流式計算的歷史: 早在7、8年前諸如UC伯克利、斯坦福等大學就開始了對流式數據處理的研究&#xff0c;但是由于更多的關注于金融行業的業務場景或者互聯網流量監控的業務場景&#xff0c;以及當時互聯網數據場景的限制&#xff0c;造成了研究多是基于對傳統數據庫處理的流式化&…

梯度下降原理及Python實現

梯度下降算法是一個很基本的算法&#xff0c;在機器學習和優化中有著非常重要的作用&#xff0c;本文首先介紹了梯度下降的基本概念&#xff0c;然后使用python實現了一個基本的梯度下降算法。梯度下降有很多的變種&#xff0c;本文只介紹最基礎的梯度下降&#xff0c;也就是批…

dagger2的初次使用

一、使用前準備 1、打開app的build.gradle文件&#xff1a; 頂部停用apt插件&#xff1a; //添加如下代碼&#xff0c;應用apt插件 apply plugin: com.neenbedankt.android-apt dependencies中添加依賴&#xff1a; //Dagger2compile com.google.dagger:dagger:2.4apt com.goog…

Storm教程2安裝部署

Storm 安裝部署 部署Storm集群需要依次完成的安裝步驟&#xff1a; 1.安裝jdk6及以上版本;   2. 搭建Zookeeper集群&#xff1b;   3. 安裝Storm依賴庫&#xff1b;   4. 下載并解壓Storm發布版本&#xff1b;   5. 修改storm.yaml配置文件&#xff1b;   6…

matplotlib一些常用知識點的整理,

本文作為學習過程中對matplotlib一些常用知識點的整理&#xff0c;方便查找。 強烈推薦ipython 無論你工作在什么項目上&#xff0c;IPython都是值得推薦的。利用ipython --pylab&#xff0c;可以進入PyLab模式&#xff0c;已經導入了matplotlib庫與相關軟件包&#xff08;例如…

JAVA課程09

package 月份輸出;import java.util.*;public class 月份輸出 {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc new Scanner(System.in);int s sc.nextInt();String a[] {"January","February","March&q…