欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用通配符實(shí)現(xiàn)增強(qiáng)泛型詳解

 更新時(shí)間:2022年08月18日 11:32:52   作者:小虛竹and掘金  
泛型是JAVA重要的特性,使用泛型編程,可以使代碼復(fù)用率提高。本文將利用通配符實(shí)現(xiàn)增強(qiáng)泛型,文中的示例代碼講解詳細(xì),感興趣的可以了解一下

使用通配符增強(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è)什么類型。

在定義泛型對象的使用方法時(shí),還不知道T是什么類型,它可能是String類型,也可能是Integer類型。如果,把T定義成一個(gè)確定的泛型數(shù)據(jù)類型,參數(shù)就只能是這種數(shù)據(jù)類型。此時(shí),就用到了通配符代替確定的泛型數(shù)據(jù)類型。

使用泛型、通配符提高了代碼的復(fù)用性。

把一個(gè)對象分為聲明、使用兩部分的話。泛型側(cè)重于類型的聲明上代碼復(fù)用,通配符則側(cè)重于使用上的代碼復(fù)用。泛型用于定義內(nèi)部數(shù)據(jù)類型的不確定性,通配符則用于定義使用的對象類型不確定性。

到此這篇關(guān)于Java使用通配符實(shí)現(xiàn)增強(qiáng)泛型詳解的文章就介紹到這了,更多相關(guān)Java增強(qiáng)泛型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis的mapper特殊字符轉(zhuǎn)移及動(dòng)態(tài)SQL條件查詢小結(jié)

    mybatis的mapper特殊字符轉(zhuǎn)移及動(dòng)態(tài)SQL條件查詢小結(jié)

    mybatis mapper文件中條件查詢符,如>=,<,之類是不能直接寫的會(huì)報(bào)錯(cuò)的需要轉(zhuǎn)移一下,本文給大家介紹了常見的條件查詢操作,對mybatis的mapper特殊字符及動(dòng)態(tài)SQL條件查詢相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-09-09
  • SpringBoot+Redis執(zhí)行l(wèi)ua腳本的方法步驟

    SpringBoot+Redis執(zhí)行l(wèi)ua腳本的方法步驟

    這篇文章主要介紹了SpringBoot+Redis執(zhí)行l(wèi)ua腳本的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 基于Java代碼實(shí)現(xiàn)游戲服務(wù)器生成全局唯一ID的方法匯總

    基于Java代碼實(shí)現(xiàn)游戲服務(wù)器生成全局唯一ID的方法匯總

    我們在做服務(wù)器系統(tǒng)開發(fā)的時(shí)候,為了適應(yīng)數(shù)據(jù)大并發(fā)的請求,需要插入數(shù)據(jù)庫之前生成一個(gè)全局的唯一id,糾結(jié)全局唯一id怎么生成呢?下面小編給大家分享Java代碼實(shí)現(xiàn)游戲服務(wù)器生成全局唯一ID的方法匯總,涉及到優(yōu)劣勢方面的知識(shí)點(diǎn),對此感興趣的朋友一起看看吧
    2016-10-10
  • mybatis中幾種typeHandler的定義使用詳解

    mybatis中幾種typeHandler的定義使用詳解

    本文主要介紹了mybatis中幾種typeHandler的定義使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java通過Scanner了解if...else if語句

    Java通過Scanner了解if...else if語句

    這篇文章主要介紹了Java通過Scanner了解if...else if語句,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java判斷字符串是否含有亂碼實(shí)例代碼

    Java判斷字符串是否含有亂碼實(shí)例代碼

    本文通過實(shí)例代碼給大家介紹了Java判斷字符串是否含有亂碼的方法,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-11-11
  • SpringBoot?項(xiàng)目中創(chuàng)建線程池

    SpringBoot?項(xiàng)目中創(chuàng)建線程池

    這篇文章主要介紹了SpringBoot?項(xiàng)目中創(chuàng)建線程池,文章基于Spring?Boot項(xiàng)目創(chuàng)建線程池ThreadPoolExecutor,需要的小伙伴可以參考一下
    2022-04-04
  • 解決IDEA JSP沒有代碼提示問題的幾種方法

    解決IDEA JSP沒有代碼提示問題的幾種方法

    這篇文章主要介紹了解決IDEA JSP沒有代碼提示問題的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • JDK源碼分析之String、StringBuilder和StringBuffer

    JDK源碼分析之String、StringBuilder和StringBuffer

    這篇文章主要給大家介紹了關(guān)于JDK源碼分析之String、StringBuilder和StringBuffer的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用jdk具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • 基于SpringBoot?Mock單元測試詳解

    基于SpringBoot?Mock單元測試詳解

    這篇文章主要介紹了基于SpringBoot?Mock單元測試詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論