Java 泛型約束

2018-01-19 11:09 更新

Java面向對象設計 - 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類型或其子類型的任何東西都應該在編譯時被拒絕。

使用上限作為數字,我們可以將方法定義為

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;
  }

}

不管你為n1和n2傳遞什么,它們將始終與Number的賦值兼容,因為編譯器確保傳遞給sum()方法的參數遵循其聲明中指定的規(guī)則 <? extends Number>。


下限通配符

指定下限通配符與指定上限通配符相反。

使用下限通配符的語法是<? super T>,這意味著“任何是T的超類型”。

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 <T> void copy(MyBag<T> source, MyBag<? super T> dest) {
    T value = source.get();
    dest.set(value);
  }
}
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號