gpt4 book ai didi

java - java 泛型中的有界通配符

转载 作者:行者123 更新时间:2023-11-30 04:02:03 26 4
gpt4 key购买 nike

我正在阅读Core Java volume-1 by Horstmann, Cay.Sgenerics 。我无法理解课本上的一些解释。我在下面给出了作者引用的示例代码。接下来是书中的文字和我的问题。

 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只知道它需要一些subtypeEmployees ,但它不知道是哪种类型。它拒绝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 类型的对象,但仅限 Managersubtypeexecutive .

问题:所以在这里我说该方法可以接受任何 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.

问题:我根本无法跟上它。听起来很简单,但并不符合逻辑。

最佳答案

以下赋值是合法的,前提是 ClerkEmployees [原文如此]。

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com