当您想要返回超类型时,这很方便;就像您在示例中所示的那样。
你取 a 作为输入并返回 a - 这是 ; 的超类型声明这一点的另一种方式是 - 但这在java中是不合法的。U
T
U
T super U
这应该是我实际意思的一个例子。假设一个非常简单的类,如:
static class Holder<T> {
private final T t;
public Holder(T t) {
this.t = t;
}
public <U super T> U whenNull(U whenNull){
return t == null ? whenNull : t;
}
}
定义的方法不会编译,这在java中是不允许的。whenNull
U super T
相反,您可以添加另一个类型参数并反转类型:
static class Holder<U, T extends U> {
private final T t;
public Holder(T t) {
this.t = t;
}
public U whenNull(U whenNull) {
return t == null ? whenNull : t;
}
}
用法是:
Holder<Number, Integer> n = new Holder<>(null);
Number num = n.whenNull(22D);
这允许返回超类型;但它看起来很奇怪。我们在类声明中添加了另一个类型。
我们可以诉诸于:
static class Holder<T> {
private final T t;
public Holder(T t) {
this.t = t;
}
public static <U, T extends U> U whenNull(U whenNull, Holder<T> holder) {
return holder.t == null ? whenNull : holder.t;
}
}
甚至使此方法保持静态。
对于现有限制,您可以尝试执行以下操作:
Optional.ofNullable(<SomeSubTypeThatIsNull>)
.orElse(<SomeSuperType>)