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

标签 java generics wildcard bounded-wildcard

我正在阅读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/

相关文章:

file - 我如何在 a 中使用通配符从 Node.js 的目录中读取文件

带有通配符/非通配符子域混合的 Apache 配置

java - 在 h2 中重置自动增量

java - 用Java创建一个web服务器/servlet容器——站在巨人的肩膀上

c# - 使用 Glass Mapper 在 Sitecore View 渲染中使用通用类型

c# - 如何实例化、操作和返回Type T

java - Spring MVC 和 JUnit : Failed to load ApplicationContext

java - 如何使用 xuggle 在 java 中读取实时网络流? (我可以在 ffmpeg 中做到这一点,而不是 xuggle)

java - 不兼容的类型,但没有意义(Java)

java - 在 Collection<?超T>