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

Java 之间有什么区别 and ?

陈康胜
2023-03-14
问题内容

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

例如,当你查看类时java.util.concurrent.LinkedBlockingQueue,构造函数具有以下签名:

public LinkedBlockingQueue(Collection<? extends E> c)

对于方法之一:

public int drainTo(Collection<? super E> c)

问题答案:

第一个说是“是E的祖先的某种类型”。第二个说是“某种类型,它是E的子类”。(在两种情况下,E本身都可以。)

因此,构造函数使用该? extends E形式,以确保在从集合中获取值时,它们将全部为E或某个子类(即,它是兼容的)。该drainTo方法试图将值放入集合中,因此集合必须具有E 或超类的元素类型。

例如,假设你有一个这样的类层次结构:

Parent extends Object
Child extends Parent

和一个LinkedBlockingQueue<Parent>。你可以构造一个传入的,以List<Child>安全地复制所有元素,因为每个元素Child都是父元素。你无法传入,List<Object>因为某些元素可能与不兼容Parent。

同样,你可以将队列排入aList<Object>因为每个队列Parent都是Object...,但是你不能将其排入a,List<Child>因为List<Child>期望所有元素都与兼容Child



 类似资料:
  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 我知道一个API称为一组用于调用某些东西的函数,一个库是一个类的集合,但是像这样的包中的API实际上是什么?我可以在不使用任何API的情况下连接到类似的类,那么为什么我们称其为J2SE API而不是J2SE软件包? 问题答案: 直接来自维基百科: 在计算机科学中,应用程序编程接口(API)是定义应用程序可以从库请求服务的方式的接口 Java在那些软件包中包含许多库(Swing等),而A

  • 问题内容: 我无法理解以下文本…这是否意味着空的构造函数?为什么拥有两个不同的版本很重要? https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html 在Java虚拟机级别,每个构造函数(第2.12节)都作为具有特殊名称的实例初始化方法出现。该名称由编译器提供。因为该名称不是有效的标识符,所以不能直接用Java编程语言编写的程序中使

  • 我正在浏览微软的Rust教程,它是关于 实现函数,以便返回对插入向量中的值的引用 这里给出了解决方案,但它与我的不同之处在于它使用了 除了返回类型之外,我的和标准解决方案之间的另一个区别是,我只是简单地返回了参数,而标准解决方案使用复杂方式)。 我想知道我的解决方案是否有任何问题,本教程采取了另一种方式? 虽然@Masklin为我的问题提供了一个很好的答案,但它有点特定于我给出的示例,但没有直接解

  • 问题内容: Scala Future和Java Future之间在概念,功能或机械方面是否存在差异?从概念上讲,我看不到任何差异,因为它们都旨在提供异步计算机制。 问题答案: 主要的不便之处在于,如果没有阻塞,就无法获得价值。 实际上,检索值的唯一方法是方法,即方法(引用docs) 等待必要的计算完成,然后检索其结果。 有了你,而不是一个真正的无阻塞的计算,因为你可以将回调完成(成功/失败),或简

  • 问题内容: 和之间有什么区别? 我不了解其中的重大区别(我已经阅读了一些有关它们的信息!)。请你帮助我好吗? 问题答案: 也许一个示例演示如何使用两种方法将有助于你更好地理解事物。因此,请考虑以下类: 如其javadoc中所述,调用将返回与具有给定字符串名称的类或接口关联的对象,即它返回受type变量影响的对象。 然后,调用创建该 对象表示的类的新实例。就像通过带有空参数列表的表达式实例化该类。换