Java使用通配符實(shí)現(xiàn)增強(qiáng)泛型詳解
使用通配符增強(qiáng)泛型
1.題目
泛型是JAVA重要的特性,使用泛型編程,可以使代碼復(fù)用率提高。
實(shí)現(xiàn):在泛型方法中使用通配符
2.解題思路
創(chuàng)建一個(gè)類:WildcardsTest。
創(chuàng)建一個(gè)方法getMiddle()用于獲得給定列表的中間值。
在泛型中,使用“?”作為通配符,通配符的使用與普通的類型參數(shù)類似,如通配符可以利用extends關(guān)鍵字來設(shè)置取值的上限。如
<? extends Number>
表示Byte,Double,F(xiàn)loat,Integer都適合這個(gè)類型參數(shù)。
還有,有上限,也有下限,如
<? super Number>
w含義是類型參數(shù)是Number類的父類,如Object.
3.代碼詳解
package com.xiaoxuzhu;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Description:
*
* @author xiaoxuzhu
* @version 1.0
*
* <pre>
* 修改記錄:
* 修改后版本 修改人 修改日期 修改內(nèi)容
* 2022/5/10.1 xiaoxuzhu 2022/5/10 Create
* </pre>
* @date 2022/5/10
*/
public class WildcardsTest {
public static Object getMiddle(List<? extends Number> list) {
return list.get(list.size() / 2);
}
public static void main(String[] args) {
List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
ints.add(3);
System.out.print("整型列表的元素:");
System.out.println(Arrays.toString(ints.toArray()));
System.out.println("整型列表的中間數(shù):" + getMiddle(ints));
List<Double> doubles = new ArrayList<Double>();
doubles.add(1.1);
doubles.add(2.2);
doubles.add(3.3);
System.out.print("浮點(diǎn)列表的元素:");
System.out.println(Arrays.toString(doubles.toArray()));
System.out.println("浮點(diǎn)列表的中間數(shù):" + getMiddle(doubles));
}
}
知識(shí)點(diǎn)補(bǔ)充
泛型
可以用<T>、<B,N>、<T extends User>等進(jìn)行泛型的聲明。其中<T extends User>的聲明方式限定了T的范圍,T只能為 User的子類。
1.參數(shù)類型用在類的創(chuàng)建中,泛型類。
2.參數(shù)類型用在接口的創(chuàng)建中,泛型接口。
3.參數(shù)類型用在方法的創(chuàng)建中,泛型方法。注意泛型<T>的聲明位置,在方法的修飾符之后,返回值類型之前。
? 類型通配符
通配符的幾種形式:
1.無限定通配符,<?>。
2.上限通配符,<? extends User>。表示參數(shù)類型只能是User的子類。
3.下限通配符,<? super User>。表示參數(shù)類型只能是User的父類。
public class P<T> {
private T t;
public T getT(){
return t;
}
//通配符
//設(shè)置指定類型的范圍,超過范圍就會(huì)報(bào)錯(cuò)
//extends : 指定范圍必須是其(這里是List)子類
public void set(P<? extends List> list){
return;
}
//super : 指定類型必須是其(這里是List)父類
public void setSuper(P<? super List> list){
return;
}
public static void main(String[] args) {
new P<String>(); //T會(huì)被替換成String
new P<Integer>(); //T會(huì)被替換成Integer
Person<String,List,Double,User> person = new Person<String,List,Double,User>();//T會(huì)被替換成String,B會(huì)被替換成List...
person.eat("魚");
}
}
class User<T extends P>{//這里給類的泛型指定范圍,T必須要繼承類P。
}
//一個(gè)類可以同時(shí)指定多個(gè)泛型
class Person<T,B,S,N>{
private T t;
private B b;
private S s;
private N n;
public void eat(T t){
this.t = t;
System.out.println("我正在吃"+this.t);
}
}泛型的聲明表明,在類、接口、方法的創(chuàng)建中,要使用一個(gè)未知的數(shù)據(jù)類型。它可以是Integer類型,也可以是String類型。就把它的類型定義成 T 、S 或者是N等等。
在實(shí)例化的時(shí)候,就必須聲明T具體是一個(gè)什么類型。
在定義泛型對(duì)象的使用方法時(shí),還不知道T是什么類型,它可能是String類型,也可能是Integer類型。如果,把T定義成一個(gè)確定的泛型數(shù)據(jù)類型,參數(shù)就只能是這種數(shù)據(jù)類型。此時(shí),就用到了通配符代替確定的泛型數(shù)據(jù)類型。
使用泛型、通配符提高了代碼的復(fù)用性。
把一個(gè)對(duì)象分為聲明、使用兩部分的話。泛型側(cè)重于類型的聲明上代碼復(fù)用,通配符則側(cè)重于使用上的代碼復(fù)用。泛型用于定義內(nèi)部數(shù)據(jù)類型的不確定性,通配符則用于定義使用的對(duì)象類型不確定性。
到此這篇關(guān)于Java使用通配符實(shí)現(xiàn)增強(qiáng)泛型詳解的文章就介紹到這了,更多相關(guān)Java增強(qiáng)泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用詳解
這篇文章主要介紹了SpringBoot中@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用詳解,@PathVariable 映射 URL 綁定的占位符,通過@RequestMapping注解中的{}占位符來標(biāo)識(shí)URL中的變量部分,需要的朋友可以參考下2024-01-01
Spring AOP有多少個(gè)通知以及它們的執(zhí)行順序介紹
這篇文章主要介紹了Spring AOP有多少個(gè)通知以及它們的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Springboot Druid 自定義加密數(shù)據(jù)庫(kù)密碼的幾種方案
這篇文章主要介紹了Springboot Druid 自定義加密數(shù)據(jù)庫(kù)密碼的步驟,幫助大家更好的理解和使用springboot,感興趣的朋友可以了解下2020-12-12
Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程詳解
這篇文章主要介紹了Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程,連續(xù)結(jié)構(gòu)和跳轉(zhuǎn)結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)中常見的兩種基本數(shù)據(jù)結(jié)構(gòu),而我們本次的主角棧和隊(duì)列都 既可以使用使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)也可以使用連續(xù)結(jié)構(gòu)實(shí)現(xiàn)2023-04-04
解決Unable to start embedded container&nbs
這篇文章主要介紹了解決Unable to start embedded container SpringBoot啟動(dòng)報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
解讀Integer類的parseInt和valueOf的區(qū)別
這篇文章主要介紹了解讀Integer類的parseInt和valueOf的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

