泛型 通配符

Java中的泛型眾所周知在jdk1.5以前是沒有的,而在jdk1.5以后sun公司就開始設(shè)置了設(shè)個(gè)在編譯階段能夠有效減少關(guān)于類型錯(cuò)誤的問題.
假如我們創(chuàng)建一個(gè)容器,

LinkedList link = new LinkedList();
這是在1.5版本以前,那么這樣創(chuàng)建之后,你可以看到
link.offer("Blake");//String type
link.offer(Math.PI);//Double type
/*可以看到不管任何類型都可以往里面添加,然而我們創(chuàng)建容器的目的是為了存儲(chǔ)相同類型的對象類型,然后可以通過多態(tài)的方式統(tǒng)一調(diào)用該對象的基類(父類)所設(shè)置的對象,但是在沒有一種約束或者說是限制我們創(chuàng)建的類型那么在代碼量增大后,出錯(cuò)的概率就大大增加了*/
//因此上面的可以改為:
LinkedList<String> link = new LinkedList<String>();
//jdk1.7以后還可以省略掉后面的尖括號(hào)
LinkedList<String> link = new LinkedList<>();

/*當(dāng)然啦,當(dāng)我們想要改變String,在換成另外一種的情況下又去修改,是不是很麻煩,那么有沒有簡單的方法啊!  答案是有的*/

LinkedList<?> link = new LinkedList<>();

//這樣設(shè)置之后就可以又添加多種類型了,可不是嘛但是這樣似乎范圍又太大了我們想要范圍小點(diǎn)
//那么讓范圍小點(diǎn)是否可行呢? 答案是的

LinkedList<? extends Number > link = new LinkedList<>();
//這樣范圍太大了可以小點(diǎn)么 是的
LinkedList<? extends Double > link = new LinkedList<>();
//這樣設(shè)置之后就只能添加Double type了

/*
關(guān)于<? extends x>或者<? super x>一點(diǎn)要小心謹(jǐn)慎
*/

原理就是這些了我在發(fā)下實(shí)際運(yùn)用的代碼

package 泛型;

import java.util.LinkedList;
import java.util.Random;

import word.WordStr;

public class Test<T> {
    private T t;

    public Test(T t) {
        this.t = t;
    }

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
    public static void fun(Test<? extends Number> x){//只能獲取  導(dǎo)出類都是可以的,也就是說只要繼承或者實(shí)現(xiàn)了Number都能夠
        System.out.println(x.getT());
    }
    public static void function(Test<? super String> s){//同樣只能獲取,如果設(shè)置了Object,因?yàn)闆]有比Object更低的了,那么就只能是Object了
        System.out.println(s.getT());                   //如果 設(shè)置的String,因?yàn)镾tring的上面一層剛好是Object所以String和Object斗可以
    }

    public static void functionx(Test<? extends String> s){
        System.out.println(s.getT());                   
    }
    public static void main(String[] args) {
        Test<Double> test = new Test<Double>(new Random(System.currentTimeMillis()).nextDouble());
        fun(test);

        Test<String> te = new Test<>(WordStr.randomStr(6));
        function(te);

        Test<Object> ty = new Test<>(WordStr.randomStr(6));
        functionx(ty);//會(huì)出現(xiàn)編譯錯(cuò)誤 ,也就是說在添加或者設(shè)置value的時(shí)候<? extends String>或者<? super String>都沒用,在設(shè)置的時(shí)候是精確匹配的
    /*
     * The method add(int, capture#4-of ? super Double) in the type LinkedList<capture#4-of ? super Double> is not applicable for the arguments (int)*/

        LinkedList<? extends Number> link = new LinkedList<>();
        LinkedList<? super Double> links = new LinkedList<>();
        links.add(55);//會(huì)編譯錯(cuò)誤 設(shè)置value的時(shí)候是精確匹配的
        /*
 * The method add(int, capture#4-of ? super Double) in the type LinkedList<capture#4-of ? super Double> is not applicable for the arguments (int)*/
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 泛型概述 泛型為JDK1.5之后sun公司推出的新功能,泛型可以消除源代碼中的許多強(qiáng)制類型轉(zhuǎn)換,泛型對于數(shù)據(jù)...
    yuan_dongj閱讀 4,553評(píng)論 0 8
  • 參考 & 推薦 Effective Java(2nd Edition)December, 2017 馬上就要出版第...
    xiaofudeng閱讀 9,048評(píng)論 1 11
  • 通配符 首先,要展示數(shù)組的一種特殊行為,可以向?qū)С鲱愋偷臄?shù)組賦予基類型的數(shù)組引用。 main()的第一行創(chuàng)建了一個(gè)...
    呆呆李宇杰閱讀 437評(píng)論 0 0
  • 夫漢尼拔者,阿非利加州迦太基人也。本為迦太基國貴胄之后,自幼隨其父長于行伍。少時(shí)目睹歐羅巴之大國羅馬入侵,欺吾鄉(xiāng)親...
    讀書局外人閱讀 952評(píng)論 3 5
  • 心情決定狀態(tài) 有什么樣的心情就有什么樣的狀態(tài)。一個(gè)好心情就會(huì)一個(gè)好的生活狀態(tài),一個(gè)壞的心情就有一個(gè)壞的生活狀態(tài)。 ...
    王思忠閱讀 291評(píng)論 0 0

友情鏈接更多精彩內(nèi)容