我正在Core Java volume-1 by Horstmann, Cay.S
阅读generics
。我无法理解教科书的一些解释。我给出了作者引用的示例代码。其次是书中的文字和我的问题。
class Employees{ }
class Manager extends Employees { }
class Pair<T>{
private T first;
private T second;
Pair(T first, T second){
this.first=first;
this.second=second;
}
void setFirst(T value){
first=value;
}
T getFirst(){
return first;
}
}
public class WildCardGenerics {
public static void main(String[] args){
Manager ceo = new Manager();
Manager cfo=new Manager();
Employees clerk = new Employees();
Pair<Manager> managers= new Pair<>(ceo,cfo);
Pair<? extends Employees> employees=managers;
employees.setFirst(clerk);
}
}
从书中:
"""没有损坏是可能的。调用setFirst
是一个type error
。要了解原因,让我们仔细看看 type Pair<? extends Employee>
。它的方法如下所示:
? extends Employee getFirst()
void setFirst(? extends Employee)
这使得无法调用该setFirst
方法。compiler
唯一知道它需要一些subtype
,但Employees
它不知道是哪种类型。它拒绝pass any specific type
——毕竟
?
可能不匹配它。"""
问题:我不明白为什么它拒绝传递任何特定类型。那么这个方法接受什么?
? extends Employee
-- 表示包括 Employee 和 Employee 的任何子类型。所以通过员工应该是合法的吗?
从书中:
pair<? super Manager> has methods:
void setFirst(? super Manager)
? super Manager getFirst()
编译器不知道该setFirst
方法的确切类型,因此不能用 type 的对象调用它Employee or Object
,而只能用Manager
或subtype
as来调用它executive
。
问题:所以在这里我说该方法可以接受任何 Manager 对象或扩展 Manager 对象(类似于上面绑定的 subytpe)。我不清楚为什么?
从书中:
Intuitively speaking, wildcards with supertype bounds let you write to a generic object, while
wildcards with subtype bounds let you read from a generic object.
问题:我根本无法遵循它。听上去很简单,但不符合逻辑的意思。