首頁 > 軟體

Java使用萬用字元實現增強泛型詳解

2022-08-18 14:01:11

使用萬用字元增強泛型

1.題目

泛型是JAVA重要的特性,使用泛型程式設計,可以使程式碼複用率提高。

實現:在泛型方法中使用萬用字元

2.解題思路

建立一個類:WildcardsTest。

建立一個方法getMiddle()用於獲得給定列表的中間值。

在泛型中,使用“?”作為萬用字元,萬用字元的使用與普通的型別引數類似,如萬用字元可以利用extends關鍵字來設定取值的上限。如

<? extends Number>

表示Byte,Double,Float,Integer都適合這個型別引數。

還有,有上限,也有下限,如

<? super Number>

w含義是型別引數是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>
 * 修改記錄:
 * 修改後版本	        修改人		修改日期			修改內容
 * 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("整型列表的中間數:" + getMiddle(ints));
        List<Double> doubles = new ArrayList<Double>();
        doubles.add(1.1);
        doubles.add(2.2);
        doubles.add(3.3);
        System.out.print("浮點列表的元素:");
        System.out.println(Arrays.toString(doubles.toArray()));
        System.out.println("浮點列表的中間數:" + getMiddle(doubles));
    }
}

知識點補充

泛型

可以用<T>、<B,N>、<T extends User>等進行泛型的宣告。其中<T extends User>的宣告方式限定了T的範圍,T只能為 User的子類。

1.引數型別用在類的建立中,泛型類。

2.引數型別用在介面的建立中,泛型介面。

3.引數型別用在方法的建立中,泛型方法。注意泛型<T>的宣告位置,在方法的修飾符之後,返回值型別之前。

? 型別萬用字元

萬用字元的幾種形式:

1.無限定萬用字元,<?>。

2.上限萬用字元,<? extends User>。表示引數型別只能是User的子類。

3.下限萬用字元,<? super User>。表示引數型別只能是User的父類別。

public class P<T> {
  private T t;
  public T getT(){
    return t;
  }

  //萬用字元
  //設定指定型別的範圍,超過範圍就會報錯
  //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會被替換成String
    new P<Integer>(); //T會被替換成Integer
    Person<String,List,Double,User> person = new Person<String,List,Double,User>();//T會被替換成String,B會被替換成List...
    person.eat("魚");
  }
}
class User<T extends P>{//這裡給類的泛型指定範圍,T必須要繼承類P。

}
//一個類可以同時指定多個泛型
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);
  }
}

泛型的宣告表明,在類、介面、方法的建立中,要使用一個未知的資料型別。它可以是Integer型別,也可以是String型別。就把它的型別定義成 T 、S 或者是N等等。

在範例化的時候,就必須宣告T具體是一個什麼型別。

在定義泛型物件的使用方法時,還不知道T是什麼型別,它可能是String型別,也可能是Integer型別。如果,把T定義成一個確定的泛型資料型別,引數就只能是這種資料型別。此時,就用到了萬用字元代替確定的泛型資料型別。

使用泛型、萬用字元提高了程式碼的複用性。

把一個物件分為宣告、使用兩部分的話。泛型側重於型別的宣告上程式碼複用,萬用字元則側重於使用上的程式碼複用。泛型用於定義內部資料型別的不確定性,萬用字元則用於定義使用的物件型別不確定性。

到此這篇關於Java使用萬用字元實現增強泛型詳解的文章就介紹到這了,更多相關Java增強泛型內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com