gpt4 book ai didi

java -

转载 作者:bug小助手 更新时间:2023-10-28 01:33:21 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





What is PECS (Producer Extends Consumer Super)?

(15 个回答)


2年前关闭。



List<? super T>有什么区别和 List<? extends T> ?

我以前用过List<? extends T> ,但它不允许我向其中添加元素 list.add(e) ,而 List<? super T>做。

最佳答案

extendsList<? extends Number> foo3的通配符声明意味着这些都是合法的分配:

List<? extends Number> foo3 = new ArrayList<Number>();  // Number "extends" Number (in this context)
List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> foo3 = new ArrayList<Double>(); // Double extends Number
  • 阅读 - 鉴于上述可能的分配,您保证从 List foo3 读取什么类型的对象:
  • 您可以阅读 Number 因为任何可以分配给 foo3 的列表包含 NumberNumber 的子类.
  • 您无法阅读 Integer因为 foo3可能指向 List<Double> .
  • 你看不懂 Double因为 foo3可能指向 List<Integer> .
  • 写作 - 鉴于上述可能的分配,您可以将什么类型的对象添加到 List foo3这对 来说是合法的全部 以上可能 ArrayList作业:
  • 您不能添加 Integer因为 foo3可能指向 List<Double> .
  • 您不能添加 Double因为 foo3可能指向 List<Integer> .
  • 您不能添加 Number因为 foo3可能指向 List<Integer> .

  • 您不能向 List<? extends T> 添加任何对象因为你不能保证什么样的 List它确实是指向的,因此您不能保证该对象在 List 中是允许的。 .唯一的“保证”是你只能从中读取,你会得到一个 TT 的子类.
    super
    现在考虑 List <? super T> .
    List<? super Integer> foo3的通配符声明意味着这些都是合法的分配:
    List<? super Integer> foo3 = new ArrayList<Integer>();  // Integer is a "superclass" of Integer (in this context)
    List<? super Integer> foo3 = new ArrayList<Number>(); // Number is a superclass of Integer
    List<? super Integer> foo3 = new ArrayList<Object>(); // Object is a superclass of Integer
  • 阅读 - 鉴于上述可能的分配,当您从 List foo3 读取时,您保证收到什么类型的对象:
  • 您不能保证获得 Integer因为 foo3可能指向 List<Number>List<Object> .
  • 您不能保证获得 Number因为 foo3可能指向 List<Object> .
  • 只有保证你会得到一个 的实例Object Object 的子类(但你不知道子类是什么)。
  • 写作 - 鉴于上述可能的分配,您可以将什么类型的对象添加到 List foo3这对 来说是合法的全部 以上可能 ArrayList作业:
  • 您可以添加 Integer因为一个 Integer允许在上述任何列表中。
  • 您可以添加 Integer 的子类的实例因为 Integer 的子类的实例允许在上述任何列表中。
  • 您不能添加 Double因为 foo3可能指向 ArrayList<Integer> .
  • 您不能添加 Number因为 foo3可能指向 ArrayList<Integer> .
  • 您不能添加 Object因为 foo3可能指向 ArrayList<Integer> .

  • 职业教育学院

    记住 PECS: 《生产者延伸,消费者超》 .
  • 《生产者扩展》 - 如果您需要 List生产T值(你想从列表中读取 T s),你需要用 ? extends T 声明它,例如List<? extends Integer> .但是您不能添加到此列表中。
  • “消费 super ” - 如果您需要 List消费 T值(您想将 T 写入列表中),您需要使用 ? super T 声明它,例如List<? super Integer> .但是不能保证您可以从此列表中读取什么类型的对象。
  • 如果您需要读取和写入列表,则需要完全声明它,没有通配符,例如List<Integer> .

  • 例子

    备注 this example from the Java Generics FAQ .注意源列表如何 src (生产 list )使用 extends ,以及目的地列表 dest (消费 list )使用 super :
    public class Collections { 
    public static <T> void copy(List<? super T> dest, List<? extends T> src) {
    for (int i = 0; i < src.size(); i++)
    dest.set(i, src.get(i));
    }
    }

    另见
    How can I add to List<? extends Number> data structures?

    关于java - <? 之间的区别 super T> 和 <?在 Java 中扩展 T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4343202/

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