首页 新闻 会员 周边

Java 泛型的这个问题 ?

0
悬赏园豆:10 [待解决问题]

Pair泛型的实际参数类型是 Pair<Interger> , 为什么不能赋值给 Number 呢 ?
有朋友说,<? super Integer> 中的 ?可能是 Integer 可能是 Number 可能是 Object, 但是,传给 pairTest 的实际类型就是 Pair<Integer> 啊 ,不可能是其他类型( 比如 Pair<Object> )呀 ? 难道编译器没看到吗 ?

春风十里不如你Ni的主页 春风十里不如你Ni | 初学一级 | 园豆:186
提问于:2023-11-12 17:33
< >
分享
所有回答(7)
2

super 就是表明下界啊, 你是想用extends吧

无敌旋律 | 园豆:206 (菜鸟二级) | 2023-11-13 10:40
1


虽然,但是。

景伟·郭 | 园豆:137 (初学一级) | 2023-11-13 10:41
0

泛型的通配符(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 的某个子类型,这样就能够实现你期望的赋值操作。

Technologyforgood | 园豆:5998 (大侠五级) | 2023-11-13 22:17
0

"传给 pairTest 的实际类型就是 Pair<Integer> ",一个方法允许多个地方调用,如果别的地方也调用了,并且传的不是Integer呢?编译器提供的检查是要保证代码安全的,所以显然是不可能通过编译的.那个 无敌旋律 老哥说的对 猜测你想要的效果是用extends替换掉super吧.

隔壁曼玉 | 园豆:220 (菜鸟二级) | 2023-11-14 17:00
0

编译错误的原因是:java.lang.Integer是final类,即不可有子类。用 <T extends java.lang.Integer> 不可以

子非鱼焉 | 园豆:220 (菜鸟二级) | 2023-12-14 17:36
0

<? 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

ASKANDANSWERS | 园豆:220 (菜鸟二级) | 2023-12-24 02:48
0

extends能决定擦除类型的上限,super无法决定擦除类型的下限,你这里Pair<? super Integer>编译之后会变成Pair<Object>。那Object转换为Number肯定报错啊。

蜗牛旅行1899 | 园豆:298 (菜鸟二级) | 2024-05-15 13:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册