为什么只有只读权限?
Topic source代码如下
public class Main {
public static void main(String[] args) {
Main main = new Main();
Pair<MyNumber> pair = new Pair<>(new MyNumber(0), new MyNumber(1));
main.func(pair);
}
public void func(Pair<? extends MyNumber> pair) {
System.out.println(pair.getFirst() + " " + pair.getLast());
pair.setFirst(new MyNumber(2)); // 报错
}
}
class MyNumber {
private int value;
public MyNumber(int value) {
this.value = value;
}
public MyNumber() {
}
@Override
public String toString() {
return "" + value;
}
}
class Pair<T> {
private T first;
private T last;
public Pair(T first, T last) {
this.first = first;
this.last = last;
}
public T getFirst() {
return first;
}
public T getLast() {
return last;
}
public void setFirst(T first) {
this.first = first;
}
public void setLast(T last) {
this.last = last;
}
}
编译时,对于Main.func
方法,因为<? extends MyNumber>
无法确定参数的泛型类型(pair的泛型类型可能为MyNumber和其子类)。试想如果pair的泛型类型为MyNumber的子类时,pair.setFirst(new MyNumber(2))
就是不行的。
没明白. 这里的 <? extends MyNumber> 不是指定的MyNumber 及 MyNumber 的子类吗?为什么的pair的泛型类型为MyNumber的子类时, 反而 new MyNumber不可以?
因为
Pair<? extends Number> p
不能确定p具体是什么
不能传入Number,因为p可能是 Pair<Integer>
不能传入Integer,因为p可能是 Pair<Double>
- 1
用户6320474804
p在经过泛型擦拭后变成:
对p的操作都应该基于Number类型。
现在假设抽象类Number是可以实例化的,
假设传入add的实参是:
与形参经过泛型擦拭后的类型相同,现在在add中调用:
new Number(2) 既满足泛型擦拭后p的要求,也满足p实际类型的要求,为什么还是会报错?
代码如下: