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)*/
}
}