日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Java中的泛型,看完這個(gè)還不會(huì),我倒立洗頭!

來源: 責(zé)編: 時(shí)間:2023-11-08 09:10:41 229觀看
導(dǎo)讀我今天聊聊Java中的泛型, 它是一個(gè)廣泛使用但討論較少的主題。我們經(jīng)常會(huì)使用它,但大多數(shù)開發(fā)人員并沒有真正了解它。Java開發(fā)中你們肯定都用過List或者ArrayList。那你們應(yīng)該記得如何定義他們吧?List<Integer> list = n

ov028資訊網(wǎng)——每日最新資訊28at.com

我今天聊聊Java中的泛型, 它是一個(gè)廣泛使用但討論較少的主題。我們經(jīng)常會(huì)使用它,但大多數(shù)開發(fā)人員并沒有真正了解它。ov028資訊網(wǎng)——每日最新資訊28at.com

Java開發(fā)中你們肯定都用過List或者ArrayList。那你們應(yīng)該記得如何定義他們吧?ov028資訊網(wǎng)——每日最新資訊28at.com

List<Integer> list = new ArrayList<>(); // 這里的Integer 就是使用了泛型

這就是我們聲明的方式。所以,我們使用了泛型。這里,<Integer>是我們傳遞的指定類型。那是一個(gè)類型。在我們創(chuàng)建這樣的列表后,您只能將整數(shù)添加到列表中。ov028資訊網(wǎng)——每日最新資訊28at.com

那如果我們不指定類型呢?ov028資訊網(wǎng)——每日最新資訊28at.com

List numList = new ArrayList<>(); //不指定類型

如果我們像上面這樣定義列表,我們就可以將從 Object 超類擴(kuò)展的任何類型的數(shù)據(jù)添加到列表中。ov028資訊網(wǎng)——每日最新資訊28at.com

所以添加泛型后,我們可以實(shí)現(xiàn)此列表的類型安全。ov028資訊網(wǎng)——每日最新資訊28at.com

泛型意味著參數(shù)化類型。Java 讓我們創(chuàng)建一個(gè)類、接口和方法,可以在泛型域中與不同類型的數(shù)據(jù)(對(duì)象)一起使用。ov028資訊網(wǎng)——每日最新資訊28at.com

泛型的優(yōu)點(diǎn)是:ov028資訊網(wǎng)——每日最新資訊28at.com

  • 代碼可重用性——我們可以使用具有多種對(duì)象類型的通用代碼
  • 編譯時(shí)類型檢查——Java 將在編譯時(shí)檢查泛型代碼是否有錯(cuò)誤
  • 類型安全——我們可以限制添加不必要的數(shù)據(jù)
  • 集合中的用法——集合需要對(duì)象類型來處理數(shù)據(jù)

讓我們舉個(gè)例子來解釋為什么我們需要泛型。ov028資訊網(wǎng)——每日最新資訊28at.com

想象一下,您必須使用打印機(jī)類打印數(shù)字和文本。打印機(jī)有一種在創(chuàng)建數(shù)據(jù)時(shí)接受數(shù)據(jù)的方法。ov028資訊網(wǎng)——每日最新資訊28at.com

在傳統(tǒng)方式中,我們必須創(chuàng)建 2 個(gè)類,因?yàn)槲覀冇?2 種數(shù)據(jù)類型:數(shù)字(整數(shù))和文本(字符串)ov028資訊網(wǎng)——每日最新資訊28at.com

public class TextPrinter {    private final String data;    public TextPrinter(String data) {        this.data = data;    }    public void print() {        System.out.println("print::: " + data);    }}
public class NumberPrinter {    private final Integer data;    public NumberPrinter(Integer data) {        this.data = data;    }    public void print() {        System.out.println("print::: " + data);    }}

使用:ov028資訊網(wǎng)——每日最新資訊28at.com

public class GenericsMain {    public static void main(String[] args) {        NumberPrinter numberPrinter = new NumberPrinter(5);        numberPrinter.print(); // 輸出 print::: 5        TextPrinter textPrinter = new TextPrinter("Hello");        textPrinter.print();   // 輸出  print::: Hello    }}

沒有覺得代碼重復(fù)了?唯一的區(qū)別就是數(shù)據(jù)類型不同!ov028資訊網(wǎng)——每日最新資訊28at.com

下面我們利用泛型來改造一下,使它成為一個(gè)通用的類型。ov028資訊網(wǎng)——每日最新資訊28at.com

public class Printer<T> {    private final T data;    public Printer(T data) {        this.data = data;    }    public void print() {        System.out.println("print::: " + data);    }}

使用:ov028資訊網(wǎng)——每日最新資訊28at.com

Printer<Integer> integerPrinter = new Printer<>(5);integerPrinter.print();   // 輸出 print::: 5Printer<String> stringPrinter = new Printer<>("Hello");stringPrinter.print();   // 輸出 print::: HelloPrinter<Double> doublePrinter = new Printer<>(45.34);doublePrinter.print();   // 輸出 print::: 45.34Printer<Long> longPrinter = new Printer<>(5L);longPrinter.print();z    //輸出 print::: 5

現(xiàn)在我們就只寫了一個(gè)類,T用來表示作為通用標(biāo)準(zhǔn)的類型。我們甚至可以為其他數(shù)據(jù)類型(例如 Double/Long)創(chuàng)建打印對(duì)象。代碼可重用性是通過風(fēng)格實(shí)現(xiàn)的。ov028資訊網(wǎng)——每日最新資訊28at.com

我們還可以創(chuàng)建多個(gè)類型的通用類。如下:ov028資訊網(wǎng)——每日最新資訊28at.com

public class MultiPrinter<T, V> {    private final T data1;    private final V data2;    public MultiPrinter(T data1, V data2) {        this.data1 = data1;        this.data2 = data2;    }    public void print() {        System.out.println("print::: " + data1 + " : " + data2);    }}
MultiPrinter<Integer, String> multiPrinter = new MultiPrinter<>(5, "Hello");multiPrinter.print(); // 輸出 print::: 5 : Hello

Java 類型命名約定:ov028資訊網(wǎng)——每日最新資訊28at.com

  • E - 元素(用于集合)
  • K — 鍵(在地圖中使用)
  • N——數(shù)字
  • T——類型
  • V - 值(在地圖中使用)
  • S、U、V 等 — 第二、第三、第四類型

有界泛型

這是泛型的高級(jí)版本。我們可以通過有界泛型來限制更多并實(shí)現(xiàn)更多類型安全。ov028資訊網(wǎng)——每日最新資訊28at.com

假設(shè)我們有一個(gè)AnimalPrinter類,它只能打印動(dòng)物詳細(xì)信息。不允許與其他物體一起使用。如何實(shí)現(xiàn)這一目標(biāo)?ov028資訊網(wǎng)——每日最新資訊28at.com

public class Animal {    private final String name;    private final String color;    private final Integer age;    public Animal(String name, String color, Integer age) {        this.name = name;        this.color = color;        this.age = age;    }    public String getName() {        return name;    }    public String getColor() {        return color;    }    public Integer getAge() {        return age;    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Animal animal = (Animal) o;        return Objects.equals(name, animal.name) && Objects.equals(color, animal.color) && Objects.equals(age, animal.age);    }    @Override    public int hashCode() {        return Objects.hash(name, color, age);    }}public class Cat extends Animal {    public Cat(String name, String color, Integer age) {        super(name, color, age);    }}public class Dog extends Animal {    public Dog(String name, String color, Integer age) {        super(name, color, age);    }}
public class AnimalPrinter<T extends Animal> {    private final T animalData;    public AnimalPrinter(T animalData) {        this.animalData = animalData;    }    public void print() {        System.out.println("Name::: " + animalData.getName());        System.out.println("Color::: " + animalData.getColor());        System.out.println("Age::: " + animalData.getAge());    }}

在這個(gè)類中,T 擴(kuò)展 Animal 部分完成了工作!我們限制了狗和貓的通用性!ov028資訊網(wǎng)——每日最新資訊28at.com

AnimalPrinter<Cat> animalPrinter1 = new AnimalPrinter<>(new Cat("Jim", "brown", 2));animalPrinter1.print();AnimalPrinter<Dog> animalPrinter2 = new AnimalPrinter<>(new Dog("Rocky", "black", 5));animalPrinter2.print();

多重界限

假設(shè)我們想向打印機(jī)通用功能添加更多功能。我們可以這樣實(shí)現(xiàn)。ov028資訊網(wǎng)——每日最新資訊28at.com

public class AnimalPrinter<T extends Animal & Serializable> {    ..................}

我使用 Serialized 接口提供了 Serialized 功能。這里有一些重要的事情需要記住。ov028資訊網(wǎng)——每日最新資訊28at.com

  • 我們必須在子類(Cat 和 Dog)中實(shí)現(xiàn)接口。
  • 類應(yīng)該放在第一位,然后是 & 和接口。
  • 由于 Java 不支持多重繼承,因此只能擴(kuò)展 1 個(gè)類。

泛型通配符

通配符由問號(hào)?表示 在 Java 中,我們用它們來指代未知類型。這可以用作泛型的參數(shù)類型。然后它將接受任何類型。在下面的代碼中,我使用通配符將任何對(duì)象的列表用作方法參數(shù)。ov028資訊網(wǎng)——每日最新資訊28at.com

public static void printList(List<?> list) {    System.out.println(list);}printList(    Arrays.asList(        new Cat("Jim", "brown", 2),        new Dog("Rocky", "black", 5)    ));printList(Arrays.asList(50, 60));printList(Arrays.asList(50.45, 60.78));// output:// [generics.Cat@b1fa3959, generics.Dog@62294cd9]// [50, 60]// [50.45, 60.78]

列表現(xiàn)在可以是任何類型!ov028資訊網(wǎng)——每日最新資訊28at.com

上限通配符

考慮這個(gè)例子:ov028資訊網(wǎng)——每日最新資訊28at.com

public static void printAnimals(List<Animal> animals) {      animals.forEach(Animal::eat);}

如果我們想象Animal的子類型,例如Dog ,我們就不能將此方法與Dog列表一起使用,即使Dog是Animal的子類型。我們可以使用通配符來做到這一點(diǎn)。ov028資訊網(wǎng)——每日最新資訊28at.com

public static void printAnimals(List<? extends Animal> animals) {    ...}

現(xiàn)在,此方法適用于Animal類型及其所有子類型。ov028資訊網(wǎng)——每日最新資訊28at.com

printAnimals(    Arrays.asList(        new Cat("Jim", "brown", 2),        new Dog("Rocky", "black", 5)    ));

這稱為上限通配符,其中Animal類型是上限。ov028資訊網(wǎng)——每日最新資訊28at.com

下界通配符

我們還可以指定具有下限的通配符,其中未知類型必須是指定類型的超類型??梢允褂胹uper 關(guān)鍵字后跟特定類型來指定下限。ov028資訊網(wǎng)——每日最新資訊28at.com

例子:ov028資訊網(wǎng)——每日最新資訊28at.com

public static void addIntegers(List<? super Integer> list){    list.add(new Integer(70));}

通用方法

想象一下,我們需要一種采用不同數(shù)據(jù)類型并執(zhí)行某些操作的方法。我們可以為此創(chuàng)建一個(gè)通用方法并重用它。ov028資訊網(wǎng)——每日最新資訊28at.com

public static <T> void call(T data) {    System.out.println(data);}call("hello");call(45);call(15.67);call(5L);call(new Dog("Rocky", "black", 5));/* output:    hello    45    15.67    5    generics.Dog@62294cd9*/

如果我們想返回?cái)?shù)據(jù)而不是 VOID,我們也可以這樣做。ov028資訊網(wǎng)——每日最新資訊28at.com

public static <T> T getData(T data) {    return data;}System.out.println(getData("Test"));   // 輸出 Test

我們也可以在通用方法中接受多種數(shù)據(jù)類型。ov028資訊網(wǎng)——每日最新資訊28at.com

public static <T, V> void getMultiData(T data1, V data2) {    System.out.println("data 1: " + data1);    System.out.println("data 2: " + data2);}getMultiData(50, "Shades of Grey");

本文鏈接:http://www.www897cc.com/showinfo-26-17651-0.htmlJava中的泛型,看完這個(gè)還不會(huì),我倒立洗頭!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 必讀!SpringBoot接口參數(shù)校驗(yàn)N種實(shí)用技巧大揭秘

下一篇: 告別Node.js版本困擾,輕松切換開發(fā)環(huán)境!

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 7月安卓手機(jī)性能榜:紅魔8S Pro再奪榜首

    7月份的手機(jī)市場(chǎng)風(fēng)平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領(lǐng)先版處理器的新機(jī)之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機(jī)廠商修整的時(shí)間,進(jìn)入8月份之
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學(xué)習(xí)反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對(duì)代碼進(jìn)行反混淆,尤其是使用自定義混淆器對(duì)其進(jìn)行混淆時(shí)。什么是混
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時(shí)間業(yè)務(wù)團(tuán)隊(duì)偶爾會(huì)碰到一些 Pulsar 使用的問題,比如消息阻塞不消費(fèi)了、生產(chǎn)者消息發(fā)送緩慢等各種問題。雖然我們有個(gè)監(jiān)控頁面可以根據(jù) topic 維度查看他的發(fā)送狀態(tài),
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內(nèi)容創(chuàng)建項(xiàng)目,添加 Spring Web 依賴項(xiàng),并單擊“生成”按鈕下載 .zip 文件,為下一步做準(zhǔn)備。請(qǐng)?jiān)谶M(jìn)入步驟2之前進(jìn)行解壓。圖
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運(yùn)營研究社作者 | 張知白編輯 | 楊佩汶設(shè)計(jì) | 晏談夢(mèng)潔這個(gè)暑期,旅游賽道徹底火了:有的「地方」火了&mdash;&mdash;貴州村超旅游收入 1 個(gè)月超過 12 億;有的「博主」火了&m
  • 三星Galaxy Z Fold5官方渲染圖曝光:13.4mm折疊厚度依舊感人

    據(jù)官方此前宣布,三星將于7月26日在韓國首爾舉辦Unpacked活動(dòng),屆時(shí)將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • OPPO K11搭載長(zhǎng)壽版100W超級(jí)閃充:26分鐘充滿100%

    據(jù)此前官方宣布,OPPO將于7月25日也就是今天下午14:30舉辦新品發(fā)布會(huì),屆時(shí)全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競(jìng)品相比,其最大的賣
  • 機(jī)構(gòu)稱Q2全球智能手機(jī)出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據(jù)外媒報(bào)道,研究機(jī)構(gòu)的報(bào)告顯示,由于需求下滑,今年二季度全球智能手機(jī)的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
  • Windows 11發(fā)布,微軟一改往常對(duì)老機(jī)型開放的態(tài)度

    距離 Windows 11 發(fā)布已經(jīng)過去一周,在過去一周里,很多數(shù)碼愛好者圍繞其對(duì) Android 應(yīng)用的支持、對(duì)老機(jī)型的升級(jí)問題展開了激烈討論。與以往不同的是,在這次大
Top 主站蜘蛛池模板: 江源县| 麻江县| 疏勒县| 门头沟区| 瓮安县| 景谷| 得荣县| 景洪市| 石河子市| 安阳县| 崇文区| 子长县| 松阳县| 色达县| 芜湖市| 包头市| 太康县| 巴中市| 连山| 五原县| 长治市| 嘉善县| 平湖市| 宜春市| 泗洪县| 德清县| 九龙城区| 苗栗县| 义马市| 泌阳县| 邢台县| 商南县| 桐庐县| 芦山县| 兰西县| 毕节市| 牙克石市| 日喀则市| 赣州市| 凤山县| 晋中市|