我正在阅读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
。要了解原因,让我们仔细看看
查看类型Pair<? extends Employee>
。它的方法如下所示:
? extends Employee getFirst()
void setFirst(? extends Employee)
这使得无法调用 setFirst
方法。 compiler
只知道它需要一些subtype
的Employees
,但它不知道是哪种类型。它拒绝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 对象(类似于上面绑定(bind)的 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.
问题: 我根本无法跟上它。听起来很简单,但并不符合逻辑。
最佳答案
以下赋值是合法的,前提是 Clerk
是 Employees
[原文如此]。
Pair<? extends Employees> employees = new Pair<Clerk>(clerk1, clerk2);
您不应该调用setFirst
并通过 Manager
,因为在这里,真的是Pair<Clerk>
.
这说明了为什么 Java 不允许在存在 T
的情况下调用其中包含泛型类型参数 ( ? extends
) 的方法。通配符。编译器不知道它到底是哪个类 - Employee
?一个子类?哪个子类?由于类型删除,JVM 无法检查类型安全,因此编译器必须禁止除 null
之外的所有此类调用。 ,它可以转换为任何引用类型并且始终是允许的。
与 ? super Employee
,下界为Employee
。可能是Pair<Object>
。但是,通过 Employee
或者它的子类之一是安全的,因为它们是 ? super Employee
允许的任何内容的子类.
关于java - java 泛型中的有界通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21741432/