Java 泛型約束

2018-01-19 11:09 更新

Java面向?qū)ο笤O(shè)計(jì) - Java泛型約束

無(wú)限通配符

通配符類(lèi)型由問(wèn)號(hào)表示,如<?> 。

對(duì)于通用類(lèi)型,通配符類(lèi)型是對(duì)象類(lèi)型用于原始類(lèi)型。

我們可以將任何已知類(lèi)型的泛型分配為通配符類(lèi)型。

這里是示例代碼:

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

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

通配符通配類(lèi)型中的問(wèn)號(hào)(例如,<?>)表示未知類(lèi)型。

當(dāng)您使用通配符聲明參數(shù)化類(lèi)型作為參數(shù)類(lèi)型時(shí),這意味著它不知道它的類(lèi)型。

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

上限通配符

我們表示通配符的上限

<? extends T>

這里,T是一種類(lèi)型。<? extends T>表示任何類(lèi)型為T(mén)或其子類(lèi)是可接受的。

例如,上限可以是數(shù)字類(lèi)型。

如果我們通過(guò)任何其他類(lèi)型,該類(lèi)型是數(shù)字類(lèi)型的子類(lèi),很好。但是,不是Number類(lèi)型或其子類(lèi)型的任何東西都應(yīng)該在編譯時(shí)被拒絕。

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

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的賦值兼容,因?yàn)榫幾g器確保傳遞給sum()方法的參數(shù)遵循其聲明中指定的規(guī)則 <? extends Number>。


下限通配符

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

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

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);
  }
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)