09_面向對象高級_泛型

泛型

1. 認識泛型

定義類、接口、方法時,同時聲明了一個或多個類型變量(如:),稱為泛型類、泛型接口、泛型方法、它們統稱為泛型。

2. 泛型類
public class Test {public static void main(String[] args) {MyArrayList<String> list = new MyArrayList<>();System.out.println(list.add("Jack"));  // trueSystem.out.println(list.get(0));  // Jack}
}// 自定義一個泛型類,去模擬 ArrayList
class MyArrayList<E> {  // 如果不想規范地寫,其實E也可以寫成其他字母private Object[] arr = new Object[10];  // 容器,用來裝東西private int size;  // 記錄當前裝了多少個public boolean add(E content) {arr[size++] = content;return true;}public E get(int index) {return (E) arr[index];}
}
public class Test {public static void main(String[] args) {MyClass<String, String> obj = new MyClass<>();obj.put("只能是String類型", "只能是String類型");
//      Others<String> obj1 = new Others<>();  // 報錯Others<MyClass> obj2 = new Others<>();  // 正常System.out.println(obj2.age);  // 輸出結果:0}
}class MyClass<E, T> {public void put(E e, T t) {}
}// 要求 E 的類型是繼承 MyClass 或者 E 的類型是 MyClass
class Others<E extends MyClass> {public int age;
}
3. 泛型接口
  • 注意:類型變量建議用大寫的英文字母,常用的有:E、T、K、V 等
import java.util.ArrayList;public class Test {public static void main(String[] args) {}
}class Student {}class Teacher {}// 泛型接口
interface Data<E> {void add(E obj);ArrayList<E> getByName(String name);}// 實現類
class StudentData implements Data<Student> {@Overridepublic void add(Student obj) {}@Overridepublic ArrayList<Student> getByName(String name) {return null;}
}// 實現類
class TeacherData implements Data<Teacher> {@Overridepublic void add(Teacher obj) {}@Overridepublic ArrayList<Teacher> getByName(String name) {return null;}
}
4. 泛型方法

案例一

public class Test {public static void main(String[] args) {System.out.println(get(10));  // 10System.out.println(get("Java"));  // JavaSystem.out.println(get(new A()));  // 對象的內存地址: login.A@3b07d329}// 泛型方法public static <T> T get(T name) {return (T) name;}// 泛型方法public static <E> void run(E index) {}
}class A {}

案例二

通配符:就是" ? ",可以在"使用泛型"的時候代表一切類型;E T K V 是在定義泛型的時候使用

import java.util.ArrayList;public class Test {public static void main(String[] args) {// 需求:實現所有的汽車都能一起參加比賽ArrayList<Car> cars = new ArrayList<>();cars.add(new BMW());cars.add(new BENZ());go(cars);ArrayList<BMW> bmws = new ArrayList<>();bmws.add(new BMW());bmws.add(new BMW());go(bmws);ArrayList<BENZ> benzs = new ArrayList<>();benzs.add(new BENZ());benzs.add(new BENZ());go(benzs);ArrayList<Dog> dogs = new ArrayList<>();dogs.add(new Dog());dogs.add(new Dog());
//      go(dogs);  // 報錯}// <T>是沒有限制數據類型的泛型,如果我們加一個限制條件,不要讓狗類進來,可以這樣寫:<T extends Cars>,完整代碼如下一行所示public static <T extends Car> void go(ArrayList<T> allCars) {}// 知識擴展:// ? 是通配符,在使用泛型的時候可以代表一切類型" ? extends Car "【上限】  " ? super Car "【下限】
//    public static void go1(ArrayList<? extends Car> allCars) {}
//    public static void go2(ArrayList<? super Car> allCars) {}
}class Car {}class BMW extends Car {}class BENZ extends Car {}class Dog {}
5. 注意事項
  • 泛型是工作在編譯階段的,一旦程序編譯成 class 文件,class 文件中就不存在泛型了,這就是泛型擦除。
  • 泛型不支持基本數據類型,只能支持對象類型(引用數據類型)
import java.util.ArrayList;public class Test {public static void main(String[] args) {
//      ArrayList<int> list1 = new ArrayList<>();  // 報錯ArrayList<Integer> list2 = new ArrayList<>();  // 正常}
}

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

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

相關文章

計算機網絡之物理層(數據通信有關)

一、概述 1.1物理層引入的目的 屏蔽掉傳輸介質的多樣性&#xff0c;導致數據傳輸方式的不同&#xff1b;物理層的引入使得高層看到的數據都是統一的0,1構成的比特流 1.2.物理層如何實現屏蔽 物理層靠定義的不同的通信協議&#xff08;一般稱通信規程&#xff09; 這些協議…

基于高質量訓練數據,GPT-4 Turbo更出色更強大

11月7日消息&#xff0c;OpenAI在首屆開發者大會上正式推出了GPT-4 Turbo。 與GPT-4相比&#xff0c;GPT-4 Turbo主要有6方面的提升&#xff1a; 1、擴展下文對話長度&#xff1a;GPT4最大只能支持8k的上下文長度&#xff08;約等于6000個單詞&#xff09;&#xff0c;而GPT-4…

智能小車速通版——手把手教程

考慮到大部分學校&#xff0c;會發放簡易小車來作為智能車初期培訓和篩選的工具&#xff0c; 于是&#xff0c;我寫一個簡單的教程&#xff0c;能夠實現簡單小車的電磁循跡。 通過這個教程&#xff0c;能夠通過簡化的步驟搭建尋跡小車&#xff0c;進而了解整個智能車是如何實…

Redis-Redis持久化,主從哨兵架構詳解

Redis持久化 RDB快照&#xff08;snapshot&#xff09; 在默認情況下&#xff0c; Redis 將內存數據庫快照保存在名字為 dump.rdb 的二進制文件中。 你可以對 Redis 進行設置&#xff0c; 讓它在“ N 秒內數據集至少有 M 個改動”這一條件被滿足時&#xff0c; 自動保存一次數…

【操作系統】I/O軟件層次結構

文章目錄 1. 前言2. I/O軟件層次結構2.1 用戶層軟件2.2 設備獨立性軟件2.3 設備驅動程序2.4 中斷處理程序 1. 前言 偶然看到“程序員的護城河是什么”這個話題&#xff0c;作為一個工作兩年多的程序員吧&#xff0c;經常看到網上關于各種35歲危機、裁員甚至猝死之云云。最近也…

modbus協議及modbus TCP協議

一、Modbus協議 1.起源 Modbus由Modicon公司于1979年開發&#xff0c;是一種工業現場總線協議標準。 Modbus通信協議具有多個變種&#xff0c;其中有支持串口&#xff0c;以太網多個版本&#xff0c;其中最著名的是Modbus RTU&#xff08;通信效率最高&#xff0c;基于串口&am…

springboot前后端分離項目配置https接口(ssl證書)

文章目錄 說明vue.js前端部署vue.js項目axios請求配置本地創建日志文件創建Dockerfile文件配置ssl證書nginx.confvue項目打包上傳創建容器部署 后端springboot項目部署配置ssl證書打包部署 補充&#xff1a;jsk證書和pfx證書補充&#xff1a;兩種證書的轉化JKS轉PFXPFX 轉 JKS …

Elasticsearch:將最大內積引入 Lucene

作者&#xff1a;Benjamin Trent 目前&#xff0c;Lucene 限制 dot_product (點積) 只能在標準化向量上使用。 歸一化迫使所有向量幅度等于一。 雖然在許多情況下這是可以接受的&#xff0c;但它可能會導致某些數據集的相關性問題。 一個典型的例子是 Cohere 構建的嵌入&#x…

使用 Lhotse 高效管理音頻數據集

Lhotse 是一個旨在使語音和音頻數據準備更具靈活性和可訪問性的 Python 庫&#xff0c;它與 k2 一起&#xff0c;構成了下一代 Kaldi 語音處理庫的一部分。 主要目標&#xff1a; 1. 以 Python 為中心的設計吸引更廣泛的社區參與語音處理任務。 2. 為有經驗的 Kaldi 用戶提供…

SpringBoot——啟動類的原理

優質博文&#xff1a;IT-BLOG-CN SpringBoot啟動類上使用SpringBootApplication注解&#xff0c;該注解是一個組合注解&#xff0c;包含多個其它注解。和類定義SpringApplication.run要揭開SpringBoot的神秘面紗&#xff0c;我們要從這兩位開始就可以了。 SpringBootApplicati…

Spring實例化對象

默認proxyBeanMethods true&#xff0c;這種方法是用的代理模式創建對象&#xff0c;每次創建都是同一個對象&#xff0c;如果改為false每次都是不同的對象 FactoryBean的使用 定義的類A&#xff0c;造出來一個類B&#xff0c;可以在創造bean之前做一些自己的個性化操作

MFS分布式文件系統

目錄 集群部署 Master Servers ?Chunkservers ?編輯Clients Storage Classes LABEL mfs高可用 pacemaker高可用 ?編輯ISCSI 添加集群資源 主機 ip 角色 server1 192.168.81.11 Master Servers server2 192.168.81.12 Chunkservers server3 192.168.81.13 Chunkserver…

【產品安全平臺】上海道寧與Cybellum將整個產品安全工作流程整合到一個專用平臺中,保持構建的互聯產品的網絡安全和網絡合規性

Cybellum將 整個產品安全工作流程 整合到一個專用平臺中 使設備制造商能夠 保持他們構建的互聯產品的 網絡安全和網絡合規性 產品安全性對 每個人來說都不一樣 每個行業的系統、工作流程和 法規都存在根本差異 因此&#xff0c;Cybellum量身定制了 Cybellum的平臺和技…

為何內存不夠用?微服務改造啟動多個Spring Boot的陷阱與解決方案

在生產環境中我們會遇到一些問題&#xff0c;此文主要記錄并復盤一下當時項目中的實際問題及解決過程。 背景簡述 最初系統上線后都比較正常風平浪靜的。在系統運行了一段時間后&#xff0c;業務量上升后&#xff0c;生產上發現java應用內存占用過高&#xff0c;服務器總共64…

打印出一個底部有n個*的漏斗c語言

題目描述 打印出一個底部有n個*的漏斗 輸入 第一行輸入一個T;表示有T組測試數據 下面每一行都有一個n表示漏斗底部*的個數 n保證是奇數 輸出 輸出打印結果 兩個測試答案之間要用換行分割 /*printf("這是第%d行 我要打印%d個* \n",Num,i); */ *********** *…

愛創科技總裁謝朝暉榮獲“推動醫藥健康產業高質量發展人物”

中國醫藥市場規模已經成為全球第二大醫藥市場&#xff0c;僅次于美國。近年來&#xff0c;隨著中國經濟的持續增長和人民生活水平的提高&#xff0c;醫藥市場需求不斷擴大。政府對醫療衛生事業的投入也在不斷加大&#xff0c;為醫藥行業的發展創造了良好的政策環境。為推動醫藥…

SparkSession介紹

一、 介紹 SparkSession是Spark 2.0中引入的新概念&#xff0c;它是Spark SQL、DataFrame和Dataset API的入口點&#xff0c;是Spark編程的統一API&#xff0c;也可看作是讀取數據的統一入口&#xff1b;它將以前的SparkContext、SQLContext和HiveContext組合在一起&#xff0…

結構體與指針_sizeof_static_extern_函數指針數組_函數指針_回調函數

一、結構體與指針 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #define up_to_down(uuu) (downdemo_t *)(uuu->beg) #define __plc__ typedef struct updemo_s{uint8_t *head;uint8_t *beg;uint8_t *end; }updemo_t; typedef struct do…

陪玩圈子系統APP小程序H5,詳細介紹,源碼交付,支持二開!

陪玩圈子系統&#xff0c;頁面展示&#xff0c;源碼交付&#xff0c;支持二開&#xff01; 陪玩后端下載地址&#xff1a;電競開黑陪玩系統小程序&#xff0c;APP&#xff0c;H5: 本系統是集齊開黑&#xff0c;陪玩&#xff0c;陪聊于一體的專業APP&#xff0c;小程序&#xff…

2:kotlin集合(Collections)

集合有助于數據分組&#xff0c;方便后續操作 集合類型說明Lists有序的可重復的集合Sets無序的不可重復的集合Maps鍵值對映射集合&#xff0c;鍵唯一&#xff0c;且一個鍵只能映射到一個值 每個集合類型都可以是可變的或者只讀的 List List按照添加的順序存儲內容&#xff…