Java泛型約束


無限萬用字元

萬用字元型別由問號表示,如 <?> 中所示。對於通用型別,萬用字元型別為物件型別用於原始型別。
可以將任何已知型別的泛型分配為萬用字元型別。
參考以下範例程式碼:

// MyBag  of  String type
MyBag<String> stringMyBag  = new MyBag<String>("Hi");

// You can  assign a  MyBag<String> to  MyBag<?> type
MyBag<?> wildCardMyBag  = stringMyBag;

萬用字元通配型別中的問號(例如,<?>)表示未知型別。當使用萬用字元宣告引數化型別作為引數型別時,這意味著不知道它的型別。

MyBag<?> unknownMyBag = new MyBag<String>("Hello");

上邊界萬用字元

上邊界萬用字元表示萬用字元的上限,如下語法

<? extends T>

這裡,T是一種型別。 <? extends T>表示任何型別為T或其子類是可接受的。
例如,上限可以是數位型別。

如果傳遞任何其他型別,是Number型別或它的子類,沒有問題。 但是,如果不是Number型別或其子型別的任何東西都會在編譯時被拒絕。

使用上限作為數位值(Number),可以將方法定義為 -

class MyBag<T> {
  private T ref;

  public MyBag(T ref) {
    this.ref = ref;
  }

  public T get() {
    return ref;
  }

  public void set(T a) {
    this.ref = a;
  }
}

public class Main {
  public static double sum(MyBag<? extends Number> n1,
      MyBag<? extends Number> n2) {
    Number num1 = n1.get();
    Number num2 = n2.get();
    double sum = num1.doubleValue() + num2.doubleValue();
    return sum;
  }

}

不管為n1n2傳遞的是什麼,它們將始終與Number的賦值相容,因為編譯器確保傳遞給sum()方法的引數遵循其宣告中指定的規則 <? extends Number>

下限萬用字元

指定下限萬用字元與指定上限萬用字元相反。使用下限萬用字元的語法是<? super T>,這表示「任何T的超型別」。

class MyBag<T> {
  private T ref;/*from w  w w. j ava 2  s  .co  m*/

  public MyBag(T ref) {
    this.ref = ref;
  }

  public T get() {
    return ref;
  }

  public void set(T a) {
    this.ref = a;
  }
}
public class Main {
  public static <T> void copy(MyBag<T> source, MyBag<? super T> dest) {
    T value = source.get();
    dest.set(value);
  }
}