欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你探索Java中的通配符與泛型

 更新時間:2023年12月12日 13:55:46   作者:每天一個技術(shù)點(diǎn)  
Java 語言中的泛型是一種強(qiáng)大的特性,它可以將類型參數(shù)化,使得代碼更具通用性和安全性,本文將深入講解 Java 通配符和泛型,有需要的小伙伴可以了解下

摘要

Java 語言中的泛型是一種強(qiáng)大的特性,它可以將類型參數(shù)化,使得代碼更具通用性和安全性。然而在泛型中,通配符也是一個非常重要的概念。本文將深入講解 Java 通配符和泛型,包括通配符的作用、使用方法以及通配符和泛型的區(qū)別,并結(jié)合示例代碼進(jìn)行說明。

一、Java 泛型

Java 泛型是一種類型參數(shù)化機(jī)制,在編譯時進(jìn)行類型檢查,提高代碼的安全性和可讀性。通過泛型,可以將具體的數(shù)據(jù)類型抽象成參數(shù)化的類型,使得代碼具有更好的通用性和適應(yīng)性。

下面是一個簡單的泛型示例:

public class Box<T> {
    private T value;

    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

public class GenericExample {
    public static void main(String[] args) {
        Box<Integer> box = new Box<>(3);
        System.out.println("Box value: " + box.getValue());
    }
}

在上述代碼中,Box 類被定義為泛型類,使用類型參數(shù) T 進(jìn)行參數(shù)化。在實例化 Box 對象時,傳入的類型參數(shù)為 Integer??梢钥吹剑?getValue() 方法中,返回值的類型被聲明為 T,而在實際運(yùn)行時,T 被具體化為 Integer。

泛型的主要優(yōu)勢是可以提高代碼的可讀性和安全性,同時可以避免運(yùn)行時的類型轉(zhuǎn)換錯誤。不過,需要注意的是 Java 泛型的實現(xiàn)是基于類型擦除(type erasure)機(jī)制的,也就是說,在編譯時,泛型信息會被擦除掉,實際上泛型類和非泛型類的代碼結(jié)構(gòu)是一樣的。

二、Java 通配符

在 Java 泛型中,通配符是一個非常重要的概念。通配符是一個特殊的類型參數(shù),它可以指定泛型的上限和下限,從而限定泛型的類型范圍。使用通配符可以讓泛型更加靈活和通用。

通配符分為兩種:extends 通配符和 super 通配符。其中,extends 通配符用于指定泛型的上限,表示參數(shù)化類型必須是指定類型或其子類,如下所示:

public class Animal { }

public class Dog extends Animal { }

public class Box<T extends Animal> {
    private T value;

    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

public class WildcardExample {
    public static void main(String[] args) {
        Box<Animal> animalBox = new Box<>(new Animal());
        Box<Dog> dogBox = new Box<>(new Dog());

        // 編譯報錯,因為 String 不是 Animal 類型
        // Box<String> stringBox = new Box<>("");

        printBox(animalBox);
        printBox(dogBox);
    }

    public static void printBox(Box<? extends Animal> box) {
        System.out.println("Box value: " + box.getValue());
    }
}

在上述代碼中,Box 類中的類型參數(shù)被指定為 T extends Animal,表示參數(shù)化類型必須是 Animal 或其子類。printBox() 方法的參數(shù)使用了 extends 通配符,表示只有參數(shù)化類型為 Animal 或其子類的 Box 類型才可以作為該方法的參數(shù)。

當(dāng)我們使用泛型時,有時候我們可能會遇到一種情況,即希望可以接收任意類型的參數(shù)。這時候就可以使用泛型通配符?,表示未知的類型。下面我將詳細(xì)說明泛型通配符的用法,并提供一個示例代碼:

通配符作為方法的參數(shù):

public void printList(List<?> list) {
    for (Object item : list) {
        System.out.println(item);
    }
}

在這個示例中,printList方法接受一個List類型的參數(shù),但是該List可以包含任意類型的元素。我們使用通配符?來表示未知的類型。在方法內(nèi)部,我們可以通過遍歷列表打印出列表中的每個元素。

通配符作為方法的返回類型:

public List<?> getList() {
    return new ArrayList<>();
}

在這個示例中,getList方法返回一個List類型的對象,但是該List可以包含任意類型的元素。同樣地,我們使用通配符?表示未知的類型。該方法可以根據(jù)實際需求返回不同類型的列表。

通過使用泛型通配符?,我們可以編寫更加靈活和通用的代碼,尤其是當(dāng)我們不確定要處理的類型時。使用通配符可以使我們的代碼更具有可重用性和擴(kuò)展性。

下面是一個示例代碼,演示了如何使用泛型通配符?:

public static void printList(List<?> list) {
    for (Object item : list) {
        System.out.println(item);
    }
}

public static void main(String[] args) {
    List<String> stringList = Arrays.asList("Hello", "World");
    List<Integer> integerList = Arrays.asList(1, 2, 3);
    
    printList(stringList); // 打印輸出: Hello World
    printList(integerList); // 打印輸出: 1 2 3
}

三、通配符與泛型的區(qū)別

Java 通配符和泛型都是 Java 泛型機(jī)制中的重要概念,但它們之間有一些區(qū)別。通配符主要用于限定泛型的范圍,可以對泛型進(jìn)行更靈活的類型判斷,而泛型則是用于參數(shù)化類型的機(jī)制。

  • 通配符用于靈活限定泛型的范圍:通配符可以使用 extends 關(guān)鍵字指定上限,也可以使用 super 關(guān)鍵字指定下限。這樣做的好處是,可以在一定程度上增加泛型的靈活性。例如,使用 extends 通配符可以接受參數(shù)化類型是指定類型或其子類的對象,使用 super 通配符可以接受參數(shù)化類型為指定類型或其父類的對象。
  • 泛型用于聲明參數(shù)化類型:泛型通過在類或方法聲明時定義類型參數(shù),實現(xiàn)了對類型的參數(shù)化。通過將具體類型替換為類型參數(shù),在編譯時進(jìn)行類型安全的檢查。泛型可以提高代碼的可讀性和安全性,并避免類型轉(zhuǎn)換錯誤。

下面是一個示例,展示了通配符和泛型之間的區(qū)別:

public class Fruit { }

public class Apple extends Fruit { }

public class Box<T> {
    private T value;

    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

public class WildcardVsGenericExample {
    public static void main(String[] args) {
        Box<Fruit> fruitBox = new Box<>(new Fruit());
        Box<Apple> appleBox = new Box<>(new Apple());

        // 使用通配符
        printBoxUsingWildcard(fruitBox);
        printBoxUsingWildcard(appleBox);

        // 使用泛型
        printBoxUsingGeneric(fruitBox);
        printBoxUsingGeneric(appleBox);
    }

    public static void printBoxUsingWildcard(Box<? extends Fruit> box) {
        System.out.println("Box value: " + box.getValue());
    }

    public static <T> void printBoxUsingGeneric(Box<T> box) {
        System.out.println("Box value: " + box.getValue());
    }
}

在上述代碼中,printBoxUsingWildcard() 方法使用 extends 通配符作為參數(shù),表示只接受參數(shù)化類型為 Fruit 或其子類的 Box 對象。而 printBoxUsingGeneric() 方法使用泛型類型參數(shù) T,可以接受任何類型的 Box 對象。通過比較兩個方法的定義可以看出,通配符和泛型在使用方式上有所差別。

總結(jié)

本文詳細(xì)講解了 Java 中的通配符和泛型的概念和用法。泛型是一種參數(shù)化類型機(jī)制,能夠提高代碼的可讀性和類型安全性。通配符主要用于限定泛型的范圍,靈活指定上限和下限。通過結(jié)合示例代碼,并添加了適當(dāng)?shù)淖⑨專Mx者能夠深入理解 Java 通配符和泛型,并能正確應(yīng)用于實際開發(fā)中,提高代碼的可維護(hù)性和健壯性。

有關(guān) Java 通配符和泛型的一些常見問題,下面為您一一解答:

1.什么時候需要使用通配符?

通配符主要用于限定泛型的類型范圍,可以增加泛型的靈活性和適用性。通配符適用于以下場景:

  • 當(dāng)不確定對象的具體類型時,可以使用通配符。
  • 當(dāng)需要將參數(shù)化類型作為方法參數(shù)或返回值類型時,可以使用通配符,以處理更多類型的對象。
  • 當(dāng)需要將具體類型限定在某個范圍內(nèi)時,可以使用通配符,并通過參數(shù)限制該范圍。
  • 當(dāng)需要訪問參數(shù)化類型的屬性或方法時,可以使用 extends 通配符限定該類型的上限。

2.什么時候需要使用泛型?

泛型主要用于將代碼參數(shù)化,提供了編譯時類型安全的檢查機(jī)制。泛型適用于以下場景:

  • 當(dāng)需要處理多種類型的對象時,可以使用泛型,讓代碼更加通用、簡潔。
  • 當(dāng)需要對傳遞的參數(shù)執(zhí)行類型檢查時,可以使用泛型,預(yù)防運(yùn)行時的類型轉(zhuǎn)換錯誤。
  • 當(dāng)需要聲明一個指定類型的集合時,可以使用泛型,表示只允許添加指定類型的對象。
  • 當(dāng)需要創(chuàng)建可重用的代碼時,可以使用泛型,使代碼更加可讀、易于維護(hù)。

3.extends 通配符和 super 通配符有什么區(qū)別?

extends 通配符和 super 通配符是通配符中常用的兩種。它們的區(qū)別在于:

  • extends 通配符:表示參數(shù)化類型必須是指定類型的子類或本身,使用時通常用于作為方法參數(shù)的類型限定。例如:Box<? extends Animal> 表示只接受 Animal 類型或其子類的 Box。
  • super 通配符:表示參數(shù)化類型必須是指定類型的父類或本身,使用時通常用于作為方法返回類型的限定。例如:Box<? super Dog> 表示只接受 Dog 類型或其父類的 Box。

4.通配符和泛型有什么區(qū)別?

通配符和泛型都是 Java 泛型機(jī)制的重要概念。通配符主要用于限定泛型的類型范圍,可以靈活指定上限和下限,提高了泛型的適用性和靈活性。而泛型主要用于參數(shù)化類型,通過將具體類型替換為類型參數(shù),在編譯時進(jìn)行類型安全的檢查。泛型可以提高代碼的可讀性和安全性,并避免類型轉(zhuǎn)換錯誤。

到此這篇關(guān)于一文帶你探索Java中的通配符與泛型的文章就介紹到這了,更多相關(guān)Java通配符與泛型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Maven 多模塊父子工程的實現(xiàn)(含Spring Boot示例)

    Maven 多模塊父子工程的實現(xiàn)(含Spring Boot示例)

    這篇文章主要介紹了Maven 多模塊父子工程的實現(xiàn)(含Spring Boot示例),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • log4j如何根據(jù)變量動態(tài)生成文件名

    log4j如何根據(jù)變量動態(tài)生成文件名

    這篇文章主要介紹了log4j如何根據(jù)變量動態(tài)生成文件名方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java調(diào)用Oss JDk實現(xiàn)刪除指定目錄下的所有文件

    Java調(diào)用Oss JDk實現(xiàn)刪除指定目錄下的所有文件

    這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用Oss JDk實現(xiàn)刪除指定目錄下的所有文件功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2025-03-03
  • 在RedisTemplate中使用scan代替keys指令操作

    在RedisTemplate中使用scan代替keys指令操作

    這篇文章主要介紹了在RedisTemplate中使用scan代替keys指令操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • SpringBoot分布式文件存儲數(shù)據(jù)庫mongod

    SpringBoot分布式文件存儲數(shù)據(jù)庫mongod

    MongoDB是一個基于分布式文件存儲的NoSQL數(shù)據(jù)庫,由C++語言編寫,旨在為Web應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫中功能最豐富最像關(guān)系數(shù)據(jù)庫的
    2023-02-02
  • Spring Cloud使用Feign實現(xiàn)Form表單提交的示例

    Spring Cloud使用Feign實現(xiàn)Form表單提交的示例

    本篇文章主要介紹了Spring Cloud使用Feign實現(xiàn)Form表單提交的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 如何為?Spring?Boot?項目配置?Logback?日志

    如何為?Spring?Boot?項目配置?Logback?日志

    由于?Spring?Boot?的默認(rèn)日志框架選用的?Logback,再加上?Log4j2?之前爆過嚴(yán)重的漏洞,所以我們這次就只關(guān)注?Logback,本文重點(diǎn)給大家介紹如何為?Spring?Boot?項目配置?Logback?日志,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Mybatis SQL日志如何轉(zhuǎn)換為可執(zhí)行sql

    Mybatis SQL日志如何轉(zhuǎn)換為可執(zhí)行sql

    這篇文章主要介紹了Mybatis SQL日志如何轉(zhuǎn)換為可執(zhí)行sql問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java短網(wǎng)址服務(wù)(TinyURL)生成算法

    java短網(wǎng)址服務(wù)(TinyURL)生成算法

    這篇文章主要為大家詳細(xì)介紹了java短網(wǎng)址服務(wù)生成算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • java如何防止表單重復(fù)提交的注解@RepeatSubmit

    java如何防止表單重復(fù)提交的注解@RepeatSubmit

    @RepeatSubmit是一個自定義注解,用于防止表單重復(fù)提交,它通過AOP和攔截器模式實現(xiàn),結(jié)合了線程安全和分布式環(huán)境的考慮,注解參數(shù)包括interval(間隔時間)和message(提示信息),使用時需要注意并發(fā)處理、用戶體驗、性能和安全性等方面,失效原因是多方面的
    2024-11-11

最新評論