【发布时间】:2014-02-12 22:39:33
【问题描述】:
我在generics 上阅读Core Java volume-1 by Horstmann, Cay.S。我无法理解教科书的一些解释。我给出了作者引用的示例代码。接下来是书中的文字和我的问题。
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。要了解原因,让我们更接近
查看类型Pair<? extends Employee>。它的方法如下所示:
? extends Employee getFirst()
void setFirst(? extends Employee)
这使得无法调用setFirst 方法。 compiler 只知道它需要Employees 中的一些subtype,但它不知道是哪种类型。它拒绝pass any specific type - 毕竟
?可能不匹配。"""
问题:
我不明白为什么它拒绝传递任何特定类型。那么这个方法接受什么?
? extends Employee -- 表示包括 Employee 和 Employee 的任何子类型。那么通过 Employee 应该是合法的吗?
从书中:
pair<? super Manager> has methods:
void setFirst(? super Manager)
? super Manager getFirst()
编译器不知道setFirst 方法的确切类型,因此不能调用它
使用Employee or Object 类型的对象,但只能使用Manager 或subtype,例如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.
问题: 我根本无法遵循它。听上去很简单,但不符合本意。
【问题讨论】:
标签: java generics wildcard bounded-wildcard