java泛型常用通配符實(shí)例解析
這篇文章主要介紹了java泛型常用通配符實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
今天在看ArrayList原碼是看到這樣的一個(gè)符號(hào),好奇怪。
?表示通配符,表示的意思是匹配E或E的子類,具體類型未知。

1.限定通配符
編寫(xiě)一個(gè)類似于ArrayList的動(dòng)態(tài)數(shù)據(jù)
public class Gys<T> {
private final static int default_capacity =10;
private int endIndex =0;
private Object[] elemts;
public Gys() {
this.elemts = new Object[default_capacity];
}
public void add(T t){
if(elemts.length-1< endIndex){
int newCapcti= default_capacity *2;
elemts= Arrays.copyOf(elemts,newCapcti);
}
elemts[endIndex++]=t;
}
public void addAll(Gys<T> cs){
for(int i=0;i<cs.size();i++){
add(cs.get(i));
}
}
public int size(){
return endIndex;
}
public T get(int i){
if(i< endIndex){
return (T) elemts[i];
}
throw new RuntimeException("索引超出界限");
}
public static void main(String[] args) {
Gys<Number> gys=new Gys<>();
gys.add(25);
Gys<Integer> gys2=new Gys<>();
gys2.add(2);
gys.addAll(gys2);
}
}

修改上面的代碼,將addAll參數(shù)改成如下
public void addAll(Gys<? extend T> cs){
for(int i=0;i<cs.size();i++){
add(cs.get(i));
}
}
這個(gè)時(shí)候代碼編譯通過(guò)了。并且能夠正常的訪問(wèn)其中的元素。
2.無(wú)限定通配符。
改寫(xiě)上面的addAll方法代碼。
public void addAll(Gys<?> cs){
for(int i=0;i<cs.size();i++){
add(cs.get(i));
}
}

上面的代碼編譯不通過(guò)。?表示類型不確定,從安全角度考慮無(wú)限定的泛型,無(wú)法進(jìn)行寫(xiě)操作。
但是可以這樣使用。
/**
*判斷元素是否存在
*/
public boolean isHas(Gys<?> gys,Object elemt){
for(int i=0;i<gys.size();i++){
if(gys.get(i).equals(elemt)){
return true;
}
}
return false;
}
除了<? extend E>用法;還有<? super E>的用法,表示類型是E或E的父類。不過(guò)多介紹了,用的少。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Intellij IDEA連接Navicat數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Intellij IDEA連接Navicat數(shù)據(jù)庫(kù)的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借價(jià)值,需要的朋友可以參考下2021-03-03
mysql+spring+mybatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離的代碼配置
今天小編就為大家分享一篇關(guān)于mysql+spring+mybatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離的代碼配置,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
Springboot文件上傳功能簡(jiǎn)單測(cè)試
這篇文章主要介紹了Springboot文件上傳功能簡(jiǎn)單測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
SWT(JFace)體驗(yàn)之Slider,Scale
SWT(JFace)體驗(yàn)之Slider,Scale實(shí)現(xiàn)代碼。2009-06-06
springboot?+rabbitmq+redis實(shí)現(xiàn)秒殺示例
本文主要介紹了springboot?+rabbitmq+redis實(shí)現(xiàn)秒殺示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
mybatis如何根據(jù)表逆向自動(dòng)化生成代碼實(shí)例
逆向工程是一個(gè)專門(mén)為 MyBatis 框架使用者設(shè)計(jì)的代碼生成器,可以根據(jù)數(shù)據(jù)庫(kù)中的表字段名,自動(dòng)生成 POJO 類,mapper 接口與 SQL 映射文件,這篇文章主要給大家介紹了關(guān)于mybatis如何根據(jù)表逆向自動(dòng)化生成代碼的相關(guān)資料,需要的朋友可以參考下2021-08-08
如何在Spring?Boot中使用MyBatis訪問(wèn)數(shù)據(jù)庫(kù)
MyBatis可以通過(guò)簡(jiǎn)單的XML或者注解來(lái)配置和映射原始類型,接口,和Java POJO為數(shù)據(jù)庫(kù)中記錄,使用MyBatis幫助我們解決各種問(wèn)題,本文介紹如何在Spring?Boot中使用MyBatis訪問(wèn)數(shù)據(jù)庫(kù),感興趣的朋友一起看看吧2023-11-11
Java開(kāi)發(fā)利器之Guava?Cache的使用教程
緩存技術(shù)被認(rèn)為是減輕服務(wù)器負(fù)載、降低網(wǎng)絡(luò)擁塞、增強(qiáng)Web可擴(kuò)展性的有效途徑之一。今天咱們就來(lái)聊聊Guava?Cache本地緩存,感興趣的可以了解一下2022-09-09

