国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

了解java中的通配符“?“

這篇具有很好參考價值的文章主要介紹了了解java中的通配符“?“。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

通配符的作用

????????先看一段代碼

????????用通配符"?"后,代碼變化

????????結(jié)論

通配符上界?

通配符下界

對通配符上下界的注釋理解及其練習(xí)代碼??


了解java中的通配符“?“,學(xué)習(xí)筆記,java,開發(fā)語言

簡記: ? ?用于在泛型的使用,即為通配符.
在Java中,通配符(wildcard)主要用于泛型編程,用于表示一個不確定的類型。
通配符有三種形式:1.通配符<?>? 2.通配符<? extends T>? ?3. 通配符<? super T>

通配符的作用

先看一段代碼
class Test0 {
    public static void main(String[] args) {
        System.out.println("===========1.String==============");
        Message<String> message1 = new Message<>();
        message1.setMessage("fly in the sky!");
        fun1(message1);

        System.out.println("===========2.Integer=============");
        Message<Integer> message2 = new Message<>();
        message2.setMessage(99);
        fun2(message2);

        System.out.println("===========3.Character============");
        Message<Character> message3 = new Message<>();
        message3.setMessage('s');
        func3(message3);

        System.out.println("===========4.Short================");
        Message<Short> message4 = new Message<>();
        message4.setMessage((short) 213);
        func4(message4);

        System.out.println("===========5.Long=================");
        Message<Long> message5 = new Message<>();
        message5.setMessage(1024L);
        func5(message5);

        System.out.println("===========6.Float=================");
        Message<Float> message6 = new Message<>();
        message6.setMessage(3.1415926f);
        func6(message6);

        System.out.println("===========7.Double================");
        Message<Double> message7 = new Message<>();
        message7.setMessage(1024.0213);
        func7(message7);

        System.out.println("===========8.Boolean===============");
        Message<Boolean> message8 = new Message<>();
        message8.setMessage(true);
        func8(message8);
    }

    public static void fun1(Message<String> tmp) {
        System.out.println(tmp.getMessage());

    }

    public static void fun2(Message<Integer> tmp) {
        System.out.println(tmp.getMessage());

    }

    public static void func3(Message<Character> tmp) {

        System.out.println(tmp.getMessage());

    }

    public static void func4(Message<Short> tmp) {
        System.out.println(tmp.getMessage());
    }

    public static void func5(Message<Long> tmp) {
        System.out.println(tmp.getMessage());
    }

    public static void func6(Message<Float> tmp) {
        System.out.println(tmp.getMessage());
    }

    public static void func7(Message<Double> tmp) {
        System.out.println(tmp.getMessage());
    }

    public static void func8(Message<Boolean> tmp) {
        System.out.println(tmp.getMessage());

    }
}
用通配符"?"后,代碼變化
class Test1 {
    public static void func(Message<?> temp) {
        System.out.println(temp.getMessage());
    }
    public static void main(String[] args) {
        System.out.println("===========1.String==============");
        Message<String> message1 = new Message<>();
        message1.setMessage("fly in the sky!");
        func(message1);

        System.out.println("===========2.Integer=============");
        Message<Integer> message2 = new Message<>();
        message2.setMessage(99);
        func(message2);

        System.out.println("===========3.Character============");
        Message<Character> message3 = new Message<>();
        message3.setMessage('s');
        func(message3);

        System.out.println("===========4.Short================");
        Message<Short> message4 = new Message<>();
        message4.setMessage((short) 213);
        func(message4);

        System.out.println("===========5.Long=================");
        Message<Long> message5 = new Message<>();
        message5.setMessage(1024L);
        func(message5);

        System.out.println("===========6.Float=================");
        Message<Float> message6 = new Message<>();
        message6.setMessage(3.1415926f);
        func(message6);

        System.out.println("===========7.Double================");
        Message<Double> message7 = new Message<>();
        message7.setMessage(1024.0213);
        func(message7);

        System.out.println("===========8.Boolean===============");
        Message<Boolean> message8 = new Message<>();
        message8.setMessage(true);
        func(message8);
    }
}
結(jié)論

結(jié)論:使用通配符"?"可以接收所有的泛型類型,從而大大減少代碼量,


?注:雖然通配符 "?" 可以接受任意類型,但正因為如此,由于不確定類型,所以在func方法中無法修改操作

了解java中的通配符“?“,學(xué)習(xí)筆記,java,開發(fā)語言


在"?"的基礎(chǔ)上又產(chǎn)生了兩個子通配符:?
? extends 類:設(shè)置通配符上限 =>??通配符上界
? super 類:設(shè)置通配符下限 =>??通配符下界

通配符上界?

通配符上界
語法:
<? extends 上界>
<? extends String>
//可以傳入的實參類型是String或者String的子類

通配符的上界,不能進行寫入數(shù)據(jù),只能進行讀取數(shù)據(jù)

?通配符下界

通配符下界 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
語法:
<? super 下界>? ? ? ? ? ? ? ? ? ? ? ? ? ??
<? super ?Integer>//代表 可以傳入的實參的類型是 Integer或者 Integer的父類類型?

通配符的下界,不能進行讀取數(shù)據(jù),只能寫入數(shù)據(jù)

class Food {
}

class Fruit extends Food {
}

class Apple extends Fruit {
}

class Banana extends Fruit {
}

了解java中的通配符“?“,學(xué)習(xí)筆記,java,開發(fā)語言

對通配符上下界的注釋理解及其練習(xí)代碼??

class Food {}
class Fruit extends Food {}
class Apple extends Fruit {}
class Banana extends Fruit {}
class Plate<T> {//設(shè)置泛型
    private T message;
    public T getMessage() {
        return message;
    }
    public void setMessage(T message) {
        this.message = message;
    }
}
public class Test2 {
    public static void main1(String[] args) {
        Plate<Apple> applePlate = new Plate<>();
        applePlate.setMessage(new Apple());
        func1(applePlate);
        Plate<Banana> bananaPlate = new Plate<>();
        bananaPlate.setMessage(new Banana());
        func1(bananaPlate);
    }

    //通配符的上界
    //通配符的上界,不能進行寫入數(shù)據(jù),只能進行讀取數(shù)據(jù)
    public static void func1(Plate<? extends Fruit> tmp) {
        //這里仍然不可以進行修改!tmp接收的是Fruit和他的子類,此時存儲的元素應(yīng)該是哪個子類無法確定。
        System.out.println(tmp.getMessage());
        Fruit b = tmp.getMessage();//向上轉(zhuǎn)型
        System.out.println(b);
    }


    //通配符的下界
    //通配符的下界,不能進行讀取數(shù)據(jù),只能寫入數(shù)據(jù)
    public static void main(String[] args) {
        Plate<Fruit> fruitPlate = new Plate<>();
        fruitPlate.setMessage(new Fruit());
        func2(fruitPlate);
        Plate<Food> foodPlate = new Plate<>();
        foodPlate.setMessage(new Food());
        func2(foodPlate);
    }

    public static void func2(Plate<? super Fruit> tmp) {
        //傳入?yún)?shù)為Fruit及其父類 ,
        //此時可以修改?。√砑拥氖荈ruit 或者Fruit的子類
        tmp.setMessage(new Apple());
        tmp.setMessage(new Fruit());
        //不能接收,這里無法確定是哪個父類,父類太多了
    }
}

??
?文章來源地址http://www.zghlxwxcb.cn/news/detail-684471.html

到了這里,關(guān)于了解java中的通配符“?“的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java泛型的繼承和通配符

    Java泛型的繼承和通配符

    繼承 兩個容器所容納的類類型是有子類父類的關(guān)系的 但是容器之間沒有 反證法: 假設(shè)做法成立 list1=list2 list 指向list2的容器實例 list1.add(123)可以成立,明顯標注 String 后是不行的 所以 類SuperA是類A的父類,則 GSuperA 與 GA 是并列關(guān)系沒有子父關(guān)系 類SuperA是類A的父類或接口

    2024年01月17日
    瀏覽(25)
  • WinDbg學(xué)習(xí)三(字符串通配符語法)

    星號(*) 代表零個或多個字符。 問號(?) 代表任意單個字符。 包含字符列表的方括號( [ ] ) 代表列表中的任何單個字符。 恰好匹配列表中的一個字符。 在這些括號內(nèi),您可以使用連字符 (-) 指定范圍。 例如,Prog[er-t7]am 匹配“Progeam”、“Program”、“Progsam”、“Progtam”和“P

    2024年01月25日
    瀏覽(27)
  • 【Java 基礎(chǔ)篇】Java類型通配符:解密泛型的神秘面紗

    【Java 基礎(chǔ)篇】Java類型通配符:解密泛型的神秘面紗

    在Java中,類型通配符(Type Wildcard)是泛型的重要概念之一。它使得我們能夠更加靈活地處理泛型類型,使代碼更通用且可復(fù)用。本文將深入探討Java類型通配符的用法、語法和最佳實踐。 類型通配符是一個用問號 ? 表示的通配符,它可以用于泛型類、方法和通配符邊界。類型

    2024年02月07日
    瀏覽(18)
  • 深入理解Java泛型、協(xié)變逆變、泛型通配符、自限定

    深入理解Java泛型、協(xié)變逆變、泛型通配符、自限定

    重寫了之前博客寫的泛型相關(guān)內(nèi)容,全部整合到這一篇文章里了,把坑都填了,后續(xù)不再糾結(jié)這些問題了。本文深度總結(jié)了函數(shù)式思想、泛型對在Java中的應(yīng)用,解答了許多比較難的問題。 純函數(shù) 協(xié)變 逆變 泛型通配符 PECS法則 自限定 Java8 引入了函數(shù)式接口,從此方法傳參可

    2023年04月20日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)(Java實現(xiàn))-字符串常量池與通配符

    數(shù)據(jù)結(jié)構(gòu)(Java實現(xiàn))-字符串常量池與通配符

    字符串常量池 在Java程序中,類似于:1, 2, 3,3.14,“hello”等字面類型的常量經(jīng)常頻繁使用,為了使程序的運行速度更快、更節(jié)省內(nèi)存,Java為8種基本數(shù)據(jù)類型和String類都提供了常量池。 “池” 是編程中的一種常見的, 重要的提升效率的方式, 我們會在未來的學(xué)習(xí)中遇到各

    2024年02月10日
    瀏覽(24)
  • Linux詳解:通配符

    Linux詳解:通配符

    Linux是一款開源操作系統(tǒng),其靈活性和可定制性一直受到開發(fā)者的喜愛和追捧。而且,Linux在文件管理方面提供了豐富的功能,例如通配符,它是一種用于匹配文件名的特殊字符。通配符在Linux中可以幫助我們更加方便和快捷地查找和操作文件。本文將介紹Linux中常用的通配符

    2024年02月09日
    瀏覽(56)
  • Elasticsearch 通配符查詢

    通配符查詢(wildcard query) 匹配字段被通配符表達式(沒有被分析)匹配的文檔。支持的通配符為*(匹配任意字符序列,包括空字符序列)以及?(匹配任意單字符)。注意,此查詢可能會很慢,它需要迭代許多字段值。為了防止極慢的通配符匹配,通配符字段值不能以一個

    2024年02月11日
    瀏覽(28)
  • 活用 命令行通配符

    活用 命令行通配符

    本文是對 阮一峰老師 命令行通配符教程 [1] 的學(xué)習(xí)與記錄 通配符早于正則表達式出現(xiàn),可以看作是原始的正則表達式. 其功能沒有正則那么強大靈活,而勝在簡單和方便. - 字符 切回上一個路徑/分支 如圖: !! 代表上一個命令, 如圖: [Linux中“!\\\"的神奇用法](https://www.cnblogs.com/bian

    2024年02月10日
    瀏覽(25)
  • 泛型的通配符

    泛型的通配符

    類型的上界決定了泛型的范圍。 我們發(fā)現(xiàn)指定了泛型的上界為數(shù)值類Number時,傳入Boolean類型就會報錯。 如果沒有指定類型的邊界,可以認可 T extends Object,當(dāng)指定了某個類型為上界,那么只接受某類型本身和子類型作為E的類型實參 我們要實現(xiàn)一個類去找數(shù)組的一個的最大值

    2023年04月08日
    瀏覽(21)
  • 【類型通配符】

    為了表示各種泛型List的父類,可以使用類型通配符 類型通配符:? List?:表示元素類型未知的List,它的元素可以匹配任何的類型 這種帶通配符的List僅表示它是各種泛型List的父類,并不能把元素添加到其中 如果不想讓List?是任何泛型的父類,只想讓它代表某一類泛型List的父

    2024年02月17日
    瀏覽(58)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包