当前位置: 首页 > 面试题库 >

? and 在java之间的区别

贺宜修
2023-03-14
问题内容

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

我曾经使用List<? extends T>,但是它不允许我向其中添加元素list.add(e),而List<? super T>确实可以。


问题答案:

extends

通配符声明List<? 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
  1. Reading -根据上述可能的任务,可以保证从中读取哪种类型的对象List foo3:

  2. 你可以阅读“ a”,Number因为任何可以分配为foo3包含Number或的子类的列表Number。

  3. 你看不到,Integer因为它foo3可能指向List<Double>
  4. 你看不到a,Double因为它foo3可能指向List<Integer>

  5. Writing -鉴于上述可能的分配,你可以添加哪种类型的对象对上述所有可能的分配List foo3都是合法的:ArrayList

  6. 你不能添加,Integer因为它foo3可能指向List<Double>

  7. 你不能添加,Double因为它foo3可能指向List<Integer>
  8. 你不能添加,Number因为它foo3可能指向List<Integer>

你不能向其中添加任何对象,List<? extends T>因为你无法保证List它真正指向的是哪种对象,因此你不能保证该对象中允许使用该对象List。唯一的“保证”是,你只能从中读取内容,并且会获得的T或子类 T。

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
  1. Reading -鉴于上述可能的任务,当你从中阅读时,可以保证接收什么类型的对象List foo3:

  2. 你不能保证一个Integer因为foo3可能指向List 或List

  3. 你不能保证一定会Number因为foo3可能指向List
  4. 该唯一的保证是,你会得到一个实例Object或子类的Object(但你不知道什么是子类)。

  5. Writing -鉴于上述可能的分配,你可以添加哪种类型的对象对上述所有可能的分配List foo3都是合法的:ArrayList

  6. 你可以添加,Integer因为Integer上述任何列表中都允许使用。

  7. 你可以添加的子类Integer的实例,因为Integer上述任何列表中都允许的的子类的实例。
  8. 你不能添加,Double因为它foo3可能指向ArrayList<Integer>
  9. 你不能添加,Number因为它foo3可能指向ArrayList<Integer>
  10. 你不能添加,Object因为它foo3可能指向ArrayList<Integer>

PECS

记住PECS:“生产者扩展,消费者超级”。

“Producer Extends” -如果需要a List来产生T值(T要从列表中读取s),则需要使用进行声明? extends T,例如List<? extends Integer>。但是你不能添加到此列表。

“Consumer Super” -如果需要a List来使用T值(要将Ts写入列表中),则需要使用进行声明? super T,例如List<? super Integer>。但是不能保证你可以从该列表中读取什么类型的对象。

  • 如果你既要读取列表又要写入列表,则需要完全声明它而没有通配符,例如List<Integer>

注意Java Generics FAQ中的这个例子。请注意源列表src(生产列表)如何使用extends,目的地列表dest(消费列表)如何使用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)); 
  } 
}


 类似资料:
  • 问题内容: 和之间有什么区别 例如,当你查看类时,构造函数具有以下签名: 对于方法之一: 问题答案: 第一个说是“是E的祖先的某种类型”。第二个说是“某种类型,它是E的子类”。(在两种情况下,本身都可以。) 因此,构造函数使用该? 形式,以确保在从集合中获取值时,它们将全部为E或某个子类(即,它是兼容的)。该方法试图将值放入集合中,因此集合必须具有 或超类的元素类型。 例如,假设你有一个这样的类层

  • 问题内容: 之间有什么区别 例如: 如果我使用一个或另一个真的有关系吗? 问题答案: 基本上destroy在模型上运行任何回调,而delete实际上不运行。 从Rails API中: 删除数据库中的记录并冻结该实例以反映不应进行任何更改(因为它们不能持久保存)。返回冻结的实例。 只需在记录的主键上使用SQL DELETE语句删除该行,就不会执行任何回调。 要强制执行对象的回调或任何:关联选项,请使

  • 问题内容: SQL解释逻辑运算符和的方式是否有所不同? 问题答案: 对于mySQL:手册未明确说明,但它们被列为相同: AND, && 逻辑与。如果所有操作数都不为零且不为NULL,则计算为1;如果一个或多个操作数为0,则计算为0,否则返回NULL。 该运算符优先级页面也没什么distiction。

  • 问题内容: 侵入性和非侵入性javascript有什么区别?简洁被赞赏。简短的例子也值得赞赏。 问题答案: 我已经不再支持它了,因为它在2011年有效,但在2018年及以后不再有效。 关注点分离。 您的HTML和CSS不受JS代码的束缚。您的JS代码未嵌入某些HTML元素。您的代码没有所有功能都具有一个大功能(或没有功能)。您具有简短的功能。 模块化。 当您正确分离关注点时,就会发生这种情况。例如

  • 问题内容: 给定下面的代码示例,行为上是否有任何差异,如果有,这些差异是什么? 据我了解,第一个将在异步函数中进行错误处理,并且错误将从异步函数的Promise中冒出来。但是,第二个需要较少的滴答声。它是否正确? 此片段只是返回Promise供参考的常用功能。 问题答案: 在大多数情况下,和之间没有可观察到的差异。这两个版本的观察行为完全相同(但根据实现的不同,该版本可能会使用更多的内存,因为可能

  • 问题内容: 两者之间有什么区别?我只是在学习Java ATM,但似乎可以双向写文件,即(我没有在这里复制try-catch块。) 和 我了解先缓冲数据的概念,这是否意味着第一个示例将字符一个接一个地写入,而第二个第一个示例则将其缓冲到内存中并写入一次? 问题答案: 如果您使用BufferedWriter则效率更高 在刷新/关闭之间有多次写入 与缓冲区大小相比,写操作较小。 在您的示例中,您只有一次