super 就是表明下界啊, 你是想用extends吧
虽然,但是。
泛型的通配符(wildcard)和子类型关系是 Java 泛型中一个比较常见的问题。在你提到的情况中,可能会存在类型不匹配的问题。
首先,让我们看一下一个简单的 Pair 类:
java
public class Pair<T> {
private T first;
private T second;
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
// Getters and setters...
}
现在,如果你有一个 Pair<Integer> 的实例,你希望将它赋值给一个 Pair<? super Integer> 的引用:
java
Pair<Integer> integerPair = new Pair<>(1, 2);
Pair<? super Integer> pairWildcard = integerPair; // 编译错误
这里会产生编译错误,原因是Java泛型中,并没有直接的类型继承关系。Pair<Integer> 和 Pair<? super Integer> 不是子类型关系。
虽然 Integer 是 Number 的子类,但是 Pair<Integer> 并不是 Pair<? super Integer> 的子类型。通配符 ? super Integer 表示的是 "未知类型,但一定是 Integer 的超类",这可能包括 Object、Number 等,而不仅仅是 Integer。
如果允许将 Pair<Integer> 赋给 Pair<? super Integer>,那么就允许将 Pair<Integer> 赋给 Pair<Object>,这可能导致运行时的类型错误,因此 Java 泛型系统禁止这样的赋值。
如果你想要能够赋值,你可以将 Pair 类设计为 Pair<? extends T>,这样就可以将 Pair<Integer> 赋给 Pair<? extends Number>:
java
public class Pair<T> {
private T first;
private T second;
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
// Getters and setters...
public static void main(String[] args) {
Pair<Integer> integerPair = new Pair<>(1, 2);
Pair<? extends Number> pairWildcard = integerPair; // OK
}
}
这样设计的泛型类允许泛型参数是 T 或 T 的某个子类型,这样就能够实现你期望的赋值操作。
"传给 pairTest 的实际类型就是 Pair<Integer> ",一个方法允许多个地方调用,如果别的地方也调用了,并且传的不是Integer呢?编译器提供的检查是要保证代码安全的,所以显然是不可能通过编译的.那个 无敌旋律 老哥说的对 猜测你想要的效果是用extends替换掉super吧.
编译错误的原因是:java.lang.Integer是final类,即不可有子类。用 <T extends java.lang.Integer> 不可以
<? super Integer> 表示泛型类型的下界限定,即接受Integer或其父类作为参数,可用于写入数据。
<? extends Integer> 表示泛型类型的上界限定,即接受Integer或其子类作为参数,可用于读取数据。
public static void pairText(Pair<? super Integer> param){}方法中使用的param是Object类型的数据,也就是Number number = (Number)param.getFirst();进行强制转换,或者将 pairText(Pair<? super Integer> param)方法中的super改为extends
the get and put principle: use an extends wildcard when you only get values out of a structure, use a super wildcard when you only put values into a structure, and don’t use a wildcard when you both get and set
? extends E语法只能执行取出操作,? super E只能执行存放操作。