127. Java 泛型 - 泛型類與子類型

文章目錄

  • 127. Java 泛型 - 泛型類與子類型
    • 1. 泛型類和接口的子類型化
      • 示例:`ArrayList` 和 `List`
    • 2. 自定義泛型接口的子類型化
      • 示例:泛型接口的子類型
      • 解釋
    • 3. 泛型類和接口的類型參數
    • 4. 總結

127. Java 泛型 - 泛型類與子類型

1. 泛型類和接口的子類型化

在 Java 中,可以通過擴展或實現泛型類或接口來對其進行子類型化。這意味著,如果一個類或接口是泛型的,它的類型參數將影響該類或接口的子類型關系。這個關系通過 extendsimplements 子句來決定。

示例:ArrayListList

考慮 Java 的 Collections 類庫,ArrayList<E> 實現了 List<E>,而 List<E> 又擴展了 Collection<E>。因此,ArrayList<String>List<String> 的子類型,而 List<String> 又是 Collection<String> 的子類型。這是泛型類之間子類型關系的一種體現。

List<String> list = new ArrayList<>();  // OK, ArrayList<String> 是 List<String> 的子類型

這就表明,當不改變類型參數時,泛型類之間會保持子類型關系。ArrayList<String>List<String> 的子類型,而 List<String> 又是 Collection<String> 的子類型。

2. 自定義泛型接口的子類型化

假設我們需要定義一個自定義的泛型接口 PayloadList,它將泛型類型 P 的值與每個元素相關聯。例如,這個接口可能聲明如下:

interface PayloadList<E, P> extends List<E> {void setPayload(int index, P val);// 其他方法
}

在這個接口中,E 代表列表元素的類型,P 代表與每個元素相關聯的“有效負載”類型。

示例:泛型接口的子類型

接下來,我們可以創建 PayloadList 的具體類型參數化版本:

PayloadList<String, String> stringPayloadList = new SomePayloadListImpl<>();
PayloadList<String, Integer> integerPayloadList = new SomePayloadListImpl<>();
PayloadList<String, Exception> exceptionPayloadList = new SomePayloadListImpl<>();
  • PayloadList<String, String>List<String> 的子類型。
  • PayloadList<String, Integer>List<String> 的子類型,盡管它使用了不同的泛型類型參數。
  • PayloadList<String, Exception> 也是 List<String> 的子類型,盡管它的第二個類型參數是 Exception

解釋

這里的核心概念是:只要不改變類型參數之間的相對關系,泛型類型之間就能保留子類型關系。即使我們在泛型接口 PayloadList 中使用不同的類型參數,它們依然可以和 List<String> 保持子類型關系。關鍵是,類型參數 E 的一致性確保了我們可以將 PayloadList<E, P> 類型的對象賦值給 List<E> 類型的變量。

3. 泛型類和接口的類型參數

泛型類和接口的類型參數與它們的子類型關系密切相關。類型參數不僅決定了接口或類的功能,還影響了它們的繼承關系和泛型約束。例如,不能將 PayloadList<String, String> 直接賦值給 PayloadList<Integer, Integer>,即使這兩個類型都繼承自 List<String>,因為它們的第二個類型參數不同。

PayloadList<String, String> list1 = new SomePayloadListImpl<>();
PayloadList<Integer, Integer> list2 = new SomePayloadListImpl<>();// 這將會報錯,因為 list1 和 list2 不是相同類型,即使它們都繼承自 List<String>。
list1 = list2;  // 編譯錯誤,類型參數不同

4. 總結

  • 泛型類和接口的子類型化:泛型類或接口的子類型關系由類型參數確定。只要不改變類型參數之間的關系,子類型關系就能保留。例如,ArrayList<String>List<String> 的子類型,而 List<String> 又是 Collection<String> 的子類型。
  • 自定義泛型接口:我們可以定義自己的泛型接口,如 PayloadList,并通過不同的類型參數創建不同的子類型。這些子類型之間仍然保持繼承關系。
  • 類型參數的關系:泛型類或接口的類型參數決定了它們的繼承關系和可賦值性。類型參數不匹配的泛型類型不能互相賦值。

通過理解這一點,學員可以更好地理解泛型類和接口之間的繼承關系,以及如何自定義泛型接口和確保類型安全。

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

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

相關文章

內網服務器怎么設置公網遠程訪問? windows桌面連接和Linux自帶SSH外網異地跨網用完整步驟教程

沒有公網IP的本地主機跨網訪問是經常需要用到的網絡場景。要設置內網服務器在公網進行異地遠程訪問&#xff0c;需依次完成確保網絡連接正常、配置防火墻、啟用遠程訪問服務、和利用類似nat123內網映射外網打通等一系列步驟&#xff0c;以保障不同內網的遠程訪問的順利進行。一…

數據提取之bs4(BeautifuSoup4)模塊與Css選擇器

BeautifuSoup4from bs4 import BeautifulSoup創建對象 <class bs4.BeautifulSoup>soup BeautifulSoup(源碼, 解析器)bs4標簽種類&#xff08;1&#xff09;tag: 標簽print(soup.title, type(soup.title))&#xff08;2&#xff09;獲取標簽里面的文本內容, 可導航的字符…

CPP中的List

一.list的介紹&#xff1a;1.list是可以在常數范圍內在任意位置進行插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。2.list的底層是雙向鏈表結構&#xff0c;帶有哨兵位的頭結點 。3. list與forward_list非常相似&#xff1a;最主要的不同在于forward_list是單…

Ntfs!LfsUpdateLfcbFromRestart函數分析之Ntfs!LfsFindOldestClientLsn

第0部分&#xff1a;//// Find the oldest client Lsn. Use the last flushed Lsn as a starting point.//Lfcb->OldestLsn Lfcb->LastFlushedLsn;LfsFindOldestClientLsn( RestartArea,Add2Ptr( RestartArea, Lfcb->ClientArrayOffset, PLFS_CLIENT_RECORD ),&…

「日拱一碼」021 機器學習——特征工程

目錄 特征選擇 過濾法&#xff08;Filter Methods&#xff09; 方差選擇法 相關系數法 卡方檢驗 包裹法&#xff08;Wrapper Methods&#xff09; 遞歸特征消除&#xff08;RFE&#xff09; 嵌入法&#xff08;Embedded Methods&#xff09; L1正則化&#xff08;Lasso…

k8s:安裝 Helm 私有倉庫ChartMuseum、helm-push插件并上傳、安裝Zookeeper

ChartMuseum 是 Kubernetes 生態中用于存儲、管理和發布 Helm Charts 的開源系統&#xff0c;主要用于擴展 Helm 包管理器的功能 核心功能 ?集中存儲?&#xff1a;提供中央化倉庫存儲Charts&#xff0c;支持版本管理和權限控制。 ? ?跨集群部署?&#xff1a;支持多集群環境…

C++編程學習(第二天)

1、求a和b兩個數之和。#include <iostream> using namespace std;int main() {int a, b, sum; //定義變量a、b、sumcout << "請輸入第一個數字a: "; //打印需要顯示的字符串cin >> a; // >&…

毫米波雷達守護銀發安全:七彩喜跌倒檢測儀重構居家養老防線

在老齡化加速與獨居老人數量攀升的背景下&#xff0c;跌倒已成為威脅老年人生命安全的“隱形殺手”。七彩喜跌倒檢測儀以毫米波雷達技術為核心&#xff0c;通過“非接觸式監測智能預警”重塑居家安全防護體系&#xff0c;為銀發群體構建起全天候、無感化的數字守護網。技術突破…

面試復盤:節流中第二次觸發的事件?答錯補課

面試復盤&#xff1a;節流中第二次觸發的事件&#xff1f;答錯補課 背景描述 今天面試時被問到一個看似基礎但暗藏玄機的問題&#xff1a;“節流&#xff08;Throttle&#xff09;函數中&#xff0c;第二次觸發的那一幀事件是否會被丟掉&#xff1f;” 我基于對經典節流實現的…

Spark偽分布式集群搭建(Ubuntu系統)

環境準備 系統要求&#xff1a;Ubuntu 20.04/22.04 LTS 軟件版本&#xff1a; Hadoop 3.3.5 JDK 8 Spark-3.5.6-bin-hadoop3 硬件要求&#xff1a;至少4GB內存&#xff0c;20GB磁盤空間 以下是基于Ubuntu系統的Spark偽分布式集群搭建全流程。以Spark 3.5.6 Hadoop 3.3.…

【快手】數據挖掘面試題0001:查找連續三天登錄的用戶

文章大綱一、測試數據構建二、自連接方案三、窗口函數方案一張用戶表&#xff0c;uer_id&#xff0c;signin_date&#xff0c;大概是這么幾項&#xff0c;查找連續三天登錄的用戶。 比如說&#xff0c;1,2兩天登錄不是連續三天&#xff0c;456登錄為連續三天登錄&#xff0c;56…

簡說scp命令

簡單介紹 scp的全稱是&#xff1a;Secure Copy Protocol&#xff08;安全復制協議&#xff09;&#xff0c;是Linux中用于在網絡中安全傳輸文件的命令行工具。它基于SSH協議&#xff0c;用于在本地服務器和遠程服務器之間&#xff0c;或者兩臺遠程服務器之間復制文件或目錄。 s…

自動化測試解決方案Parasoft SOAtest無腳本UI測試實踐指南

傳統UI自動化測試常面臨技術門檻高、維護成本大、穩定性差等挑戰。尤其在頁面頻繁變更時&#xff0c;測試腳本的更新和維護會顯著降低測試效率。 自動化測試解決方案Parasoft SOAtest通過可視化操作和智能元素定位技術&#xff0c;無需編寫代碼&#xff0c;讓測試人員能夠像真…

vscode配置頭文件和編譯器

在 VS Code 中配置編譯器和頭文件路徑需要修改兩個核心文件&#xff1a;c_cpp_properties.json&#xff08;用于智能提示&#xff09;和 tasks.json&#xff08;用于構建&#xff09;。以下是詳細步驟&#xff1a; —### 1. 配置智能提示和頭文件路徑 (c_cpp_properties.json)作…

HTML+JS+CSS制作一個數獨游戲

閑來無事&#xff0c;用HTMLJSCSS制作了一個數獨游戲消遣。其實主要是自己做題的時候用筆畫刪除數字太容易出錯&#xff0c;所以想搞一個程序稍微輔助一下。通過制作這個程序&#xff0c;反而提高了手工做題的水平&#xff0c;至少學會了記錄步數以便于回退。 20250710功能更新…

嵌入式硬件中電容的基本原理與實現詳解02

我們今天重點討論點知識點如下: 1.各種種類的電容優缺點對比講解 2.電容的標稱值介紹 3.電容的單位介紹 4.常見的電壓信號有哪些? 5. 電容的耐壓值講解 6.電容的容值有哪些? 7.12pF、15pF 電容常用在什么場合? 8. 振蕩電路中使用的電容常常需要使用什么材質的電容? 9.100n…

Python訓練打卡DAY46

DAY46&#xff1a;通道注意力&#xff08;SE注意力&#xff09; 恩師浙大疏錦行 知識點&#xff1a; 不同CNN層的特征圖&#xff1a;不同通道的特征圖什么是注意力&#xff1a;注意力家族&#xff0c;類似于動物園&#xff0c;都是不同的模塊&#xff0c;好不好試了才知道。通…

fastadmin_php專項

1.時間的判斷,還有就是在php這邊如何去拿前端html元素上面的值input($row.borrowtime);// 創建兩個 DateTime 對象$row_expecttime new \DateTime(input($row.borrowtime));$par_expecttime new \DateTime( $params[expecttime]); // // 計算兩個日期之間的差異 // …

如何在MySQL中選擇使用InnoDB還是MyISAM引擎?

在 MySQL 中選擇 InnoDB 還是 MyISAM 存儲引擎時&#xff0c;需根據應用場景的需求權衡功能、性能和數據完整性。以下是具體的選擇指南&#xff1a; 1. 優先考慮事務和外鍵需求必須使用 InnoDB&#xff1a; 若應用需要 事務支持&#xff08;如金融轉賬、訂單處理&#xff09;或…

邀請函 | 知從科技邀您共赴2025 RISC-V 中國峰會

第五屆RISC-V中國峰會將于2025年7月16至19日在上海張江科學會堂隆重舉辦&#xff0c;本屆峰會由上海開放處理器產業創新中心&#xff08;SOPIC&#xff09;主辦&#xff0c;RISC-V國際開源實驗室&#xff08;RIOS實驗室&#xff09;和上海張江高科技園區開發股份有限公司聯合主…