gpt4 book ai didi

Java泛型 super 关键字

转载 作者:IT老高 更新时间:2023-10-28 13:50:53 24 4
gpt4 key购买 nike

我浏览了这些主题

但是,我似乎仍然对 super 感到迷茫。关键词:

  1. 当我们这样声明一个集合时:

    List<? super Number> list = null;
    list.add(new Integer(0)); // this compiles
    list.add(new Object()); // this doesn't compile

不应该相反吗 - 我们有一个列表,其中包含一些对象(类型未知),它们是 Number 的父对象.所以Object应该适合(因为它是 Number 的父级)和 Integer不应该。出于某种原因,情况正好相反。

  1. 如果我们有以下代码

    static void test(List<? super Number> param) {
    param.add(new Integer(2));
    }

    public static void main(String[] args) {
    List<String> sList = new ArrayList<String>();
    test(sList); // will never compile, however...
    }

编译上述代码是不可能的(我的理智表明这是正确的行为),但基本逻辑可能证明相反:

String is Object, Object is superclass of Number. So String should work.

我知道这很疯狂,但这不是他们不允许 <S super T> 的原因吗?结构体?如果是,那为什么 <? super T>允许吗?

有人可以帮我恢复这个逻辑链的缺失部分吗?

最佳答案

List<? super Number> 中的有界通配符可以抓到Number及其任何父类(super class)型。从 Number extends Object implements Serializable ,这意味着当前唯一可被 List<? super Number> 捕获转换的类型是:

  • List<Number>
  • List<Object>
  • List<Serializable>

请注意,您可以 add(Integer.valueOf(0))对上述任何一种类型。但是,你不能 add(new Object())List<Number>List<Serializable> ,因为这违反了泛型类型安全规则。

因此你可以add Number 的任何父类(super class)型到 List<? super Number> ;这根本不是有界通配符和捕获转换的工作方式。您没有声明 List<? super Number>因为您可能想要添加 Object对它(你不能!);你这样做是因为你想添加 Number反对它(即它是 Number 的“消费者”),只是一个 List<Number>太严格了。

引用文献

另见

  • Effective Java 2nd Edition ,第 28 条:使用有界通配符提高 API 灵 active
    • “PECS代表生产者-extends,消费者-super

相关问题

  • 太多,无法列出,PECS,new Integer(0)valueOf

关于Java泛型 super 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3847162/

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