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类型或它的子类,没有问题。 但是,如果不是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);
  }
}