了解 的上限和下限 ?在 Java 泛型中

2024-01-11

我真的很难理解通配符参数。对此我有几个问题。

  1. ?作为类型参数只能在方法中使用。例如:printAll(MyList<? extends Serializable>)我无法定义类?作为类型参数。

  2. 我了解上限?. printAll(MyList<? extends Serializable>)方法: ”printAll将打印MyList如果它有实现的对象Serialzable界面。"
    我有一点问题super. printAll(MyList<? super MyClass>)方法: ”printAll将打印MyList如果它有对象MyClass或任何扩展的类MyClass(的后代MyClass)."

纠正我哪里错了。

简而言之,仅T or E or K or V or N可以用作定义泛型类的类型参数。?只能在方法中使用


Update 1:
public void printAll(MyList<? super MyClass>){
    // code code code
}

根据艾弗·霍顿的书,MyList<? super MyClass>意味着我可以打印MyList如果它有对象MyClass或其实现的任何接口或类。那是,MyClass is a 下限。它是继承层次结构中的最后一个类。这意味着我最初的假设是错误的。

那么,说如果MyClass好像:

public class MyClass extends Thread implements ActionListener{
    // whatever
}

then, printAll()将打印如果
1. 有以下对象MyClass在列表中
2.有对象Thread or ActionListener in the List


Update 2:

所以,在阅读了这个问题的许多答案后,我的理解是:

  1. ? extends T means 任何扩展的类T。因此,我们指的是的孩子T。因此,T是上限。继承层次结构中最上层的类

  2. ? super T means 任何类/接口super of T。因此我们指的是所有的父母T. T因此是下界。继承层次结构中最底层的类


?作为类型参数只能在方法中使用。例如:printAll(MyList<? extends Serializable>)我无法定义类?作为类型参数。

通配符 (?) 不是正式的类型参数,而是可以用作类型参数。在你给出的例子中,? extends Serializable作为泛型类型的类型参数给出MyList, 的printAll方法的参数。

Methods 还可以声明类型参数 http://docs.oracle.com/javase/tutorial/extra/generics/methods.html像类,例如:

static <T extends Serializable> void printAll(MyList<T> myList)

我了解上限?. printAll(MyList<? extends Serializable>) means 如果 MyList 具有实现 Serialzable 接口的对象,则 printAll 将打印 MyList

更准确地说,它的意思是打电话给printAll仅当传递 a 时才会编译MyList具有某种泛型类型或实现Serializable。在这种情况下,它将接受MyList<Serializable>, MyList<Integer>, etc.

我有一点问题super. printAll(MyList<? super MyClass>) means 如果 MyList 具有 MyClass 或任何扩展 MyClass 的类的对象,则 printAll 将打印 MyList(MyClass 的后代)

通配符的边界为super is a lower边界。所以我们可以说打电话给printAll仅当传递 a 时才会编译MyList一些泛型类型是MyClass或某些超类型MyClass。所以在这种情况下它会接受MyList<MyClass>, e.g. MyList<MyParentClass>, or MyList<Object>.

所以,假设 MyClass 看起来像:

public class MyClass extends Thread implements ActionListener{
    // whatever
}

那么 printAll() 将打印如果

  1. 列表中有MyClass的对象
  2. 列表中有Thread或ActionListener的对象

你走在正确的轨道上。但我想说例如“如果有物体,它将打印MyClass在列表中”是有问题的。这听起来像是您正在定义运行时行为 - 泛型都是关于编译时检查的。例如,无法通过MyList<MySubclass>作为论据MyList<? super MyClass>,即使它可能包含实例MyClass,通过继承。我将其改写为:

致电printAll(MyList<? super MyClass>)仅当传递以下参数时才会编译:

  1. MyList<MyClass>
  2. MyList<Thread>
  3. MyList<Runnable>
  4. MyList<ActionListener>
  5. MyList<EventListener>
  6. MyList<Object>
  7. MyList<? super X> where X is MyClass, Thread, Runnable, ActionListener, EventListener, or Object.

所以,在阅读了这个问题的许多答案之后,这是我的 理解:

? extends T means 任何扩展 T 的类。因此,我们指的是 T 的孩子。因此,T 是上限。最上层阶级 在继承层次结构中

? super T表示任何类/接口superT.因此我们是 指的是T的所有父母。因此 T 是下界。这 继承层次结构中最底层的类

接近,但我不会说“孩子们T”或“父母T“,因为这些界限是包括的- 更准确的说法是“T或其子类型”和“T或其超类型”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 的上限和下限 ?在 Java 泛型中 的相关文章

  • 使用 BlobOutputStream 在 Azure 中上传 blob

    我正在尝试直接从流上传 blob 因为我不知道我决定尝试的流的长度这个答案 https stackoverflow com a 24621538 3695939 这不起作用 即使它从流中读取并且不会抛出任何异常 内容也不会上传到我的容器 我
  • string.split("(?!^)") 解释

    我正在尝试将字符串的字符拆分为字符串数组 我找到了解决方案here https stackoverflow com questions 5235401 split string into array of character strings
  • 创建通用数组时出错

    public class TwoBridge implements Piece private HashSet
  • Java中如何合并两个数组?

    它不是连接而是合并两个数组 使它们成为名称值对的数组 firstarray a aa aaa secondarray b bb bbb result a b aa bb aaa bbb 最好的方法是什么 in Java public sta
  • Java selenium - 如何在 TimeoutException 之后正确刷新网页?

    ChromeOptions options new ChromeOptions options addExtensions new File extension 6 2 5 0 crx ZenMate options addExtensio
  • selenium 2.0 中的 isElementPresent

    大家好 我正在使用 webdriver 所以如果我想使用 selenium s rc 函数 isElementPresent 我必须模拟 selenium rc 所以我会执行以下操作 import org openqa selenium B
  • Java中的字节和字符转换

    如果我将一个字符转换为byte然后回到char 那个角色神秘地消失了 变成了别的东西 这怎么可能 这是代码 char a line 1 byte b byte a line 2 char c char b line 3 System out
  • Mediaplayer 播放几次后停止播放

    我有一个按钮 按下它会播放一个随机声音剪辑 然后播放另一个声音剪辑 然后通过一个媒体播放器播放另一个声音剪辑 但是多次按下该按钮 15 20 次 后 所有音频都会停止 我在播放最后一个音频剪辑后释放媒体播放器 所以我不认为这是原因 有什么指
  • Android Studio:如果设置项目的背景颜色,ListView OnClick 动画将不起作用

    在我的项目中 我在 ListView 内设置了项目 由插入 ConstraintLayout 中的多个元素组成 的背景颜色 但如果背景颜色不是至少一点透明 则单击和长按的默认动画会消失 事实上 随着透明度的降低 点击元素的效果越来越不明显
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • 使用 Microsoft REST API - Java 将 Xbox-Live GamerTag 转换为 XUID

    我有一个 Java 应用程序 它需要能够获取用户输入的 Minecraft Bedrock Edition 玩家标签 并将其转换为给定帐户的 XUID 以便我可以将其存储起来以供稍后列入白名单和参考目的 我一直在浏览 Microsoft R
  • Java 套接字 - 读和写

    问题 客户端没有收到任何消息 这是客户端和服务器的完整代码 CLIENT public class Client extends Socket public Client String hostName int port throws Un
  • 如何在 PuTTY 中保存并运行 Java 文件?

    我是 AWS 亚马逊网络服务 的新手 所以这可能是一个基本问题 我在 AWS 上创建了一个 EC2 实例 我有一台 Windows 计算机 因此我使用 PUTTY 来连接 Linux 实例 连接到我的 EC2 实例后 我使用以下命令编写 J
  • 无法删除临时文件夹(有时)

    当我启动应用程序时 我创建一个临时文件夹 public static File createTempDir String name throws IOException File tempDir File createTempFile na
  • Java:如果数组大小未知,如何初始化?

    我要求用户输入 1 到 100 之间的一些数字并将它们分配到一个数组中 数组大小未初始化 因为它取决于用户输入数字的次数 我应该如何分配数组长度 如果用户输入 5 6 7 8 9 5 个数字 则 int list becomes int l
  • Java/Hibernate - 异常:内部连接池已达到其最大大小,当前没有可用的连接

    我第一次在大学项目中使用 Hibernate 而且我还是个新手 我想我遵循了我的教授和我阅读的一些教程给出的所有指示 但我不断收到标题中的异常 Exception in thread main org hibernate Hibernate
  • 为什么 CompletableFuture 的 thenAccept() 不在主线程上运行

    我在 CompletableFuture 的 SupplyAsync 中处理长时间运行的操作 并将结果放入 thenAccept 中 有时 thenAccept 在主线程上执行 但有时它在工作线程上运行 但我只想在主线程上运行 thenAc
  • 如果 @transactional 在类级别应用,如何拦截 @transactional 参数

    我想捕获 transactional 的参数 如果它应用于类级别 例如如果 transactional应用在方法级别 例如 class A transactional readOnly true public void someMethod
  • Swing GUI 出现 IntelliJ 错误“contentPane 无法设置为 null。”从终端编译时

    当我从 IntelliJ 编译我的项目时 没有任何问题 我的程序运行顺利 但是当我尝试使用 javac 从终端编译它时 警告 注意 Victor presentation TableControllerMenu java 使用未经检查或不安
  • 在 Spark MLlib 上使用 Java 中的 Breeze

    在尝试从Java使用MLlib时 使用微风矩阵运算的正确方法是什么 例如scala 中的乘法很简单 matrix vector 相应的功能在Java中是如何表达的 有一些方法 例如 colon times 可以通过正确的方式调用 breez

随机推荐

  • 检索已离线缓存的文档是否会算作已读?

    在我的应用程序中 每次用户打开其个人资料页面时 该应用程序都会获得一个包含 Firestore 个人资料信息的文档 因此 用户第一次打开应用程序时 它将从 Firestore 服务器下载文档 然后将其离线缓存在设备上 离线持久性打开 现在假
  • 如何将数据发送到与当前请求处理程序不同的请求? (带有 ThreadingMixIn 的 Python SocketServer)

    我正在用Python编写一个多人游戏服务器和客户端 使用内置的SocketServer的TCPServer和ThreadingMixIn 因为它看起来比手动管理套接字和线程模块更容易 我想坚持使用内置模块 它使用类似于 HTTP 的协议进行
  • 使用“union”在整数和数组之间进行类型双关?

    在整数和整数数组之间进行类型双关是否合法 具体代码 include
  • Flask 邮件安全不满足 Microsoft Outlook 的安全要求?

    我们有一个向客户端发送电子邮件的 Web 应用程序 该 Web 应用程序使用 Flask 邮件框架来处理该问题 大约两周前 我们的网络应用程序无法向客户和我们自己的团队发送电子邮件 我们使用 Office 365 的 Outlook 作为发
  • 解析XML时所有nodeValue字段均为None

    我正在用 Python 构建一个简单的基于 Web 的 RSS 阅读器 但在解析 XML 时遇到问题 我首先在 Python 命令行中尝试了一些东西 gt gt gt from xml dom import minidom gt gt gt
  • 使用 IObservable 进行批处理

    我的服务器端向我发送批量消息 批次中的消息数量和频率是任意的 有时 我每隔 1 分钟就会收到一条消息 有时一小时内都没有收到消息 1 到 10 条消息 我当前的实现使用Observable Buffer TimeSpan FromSecon
  • 我们如何指定 tabhost 中每个选项卡的宽度?

    我在我的应用程序中使用 tabhost 我们可以为每个选项卡提供单独的宽度属性吗 即 一个宽度较大 另一个宽度较小 我们可以在代码中提及制表符宽度 例如 tabHost getTabWidget getChildAt 0 getLayout
  • 适配器 getView 被多次调用,位置为 0

    我在从动态布局渲染 ListView 时面临一些问题 我不知道为什么getView仅在位置 0 处被调用多次 我通过互联网和 stackoverflow 进行搜索 但找不到合适的答案 我实际上正在尝试做一个演示 http www frame
  • @Asynchronous bean 内部的 Java 注入

    我有 2 个使用注入来 传递 从中提取的 UserData 信息的 beanHttpRequest 如果我删除 Asynchronous从 WorkerBean 开始 然后它就可以工作了 WorkerBean 可以访问注入的 UserInf
  • SQL Azure 数据同步生产准备好了吗?

    我想开始使用 SQL Azure 和 SQL Azure 数据同步 适用于本地 SQL 2008 和 Azure Azure 门户仍然将数据同步标记为 预览 那么它是否已准备好投入生产 如果不是的话什么时候会呢 任何标记为 预览中 的内容都
  • 使用 jQuery 动态检查和取消检查复选框:bug?

    我制作了一个脚本来控制主从复选框 自动选中和取消选中 这是我的JS document ready function myCheck click function myCheck attr checked false myCheck clic
  • Qt - 信号槽中的参数

    我有一个 QPushButton QDateEdit 和另一个自定义对象 我想将按钮连接到日期编辑对象 当我单击按钮时 日期编辑对象会将其设置日期更改为自定义对象上定义的日期 有点像这样 connect pushbutton SIGNAL
  • 使用 LOGON32_LOGON_NEW_CREDENTIALS 的 LogonUser 适用于远程不受信任的域计算机

    因此 两台机器之间不存在信任 它们位于不同的域中 我已使用登录类型使用 LogonUser API 成功连接到远程计算机 LOGON32 LOGON NEW CREDENTIALS 我能够使用 UNC 共享检索目录的内容 并创建文件流来 下
  • App Store Connect 不显示所有销售 - 为什么?

    为了能够更好地估计我们应用程序的收入 我们实现了一个数据库功能 该功能可靠地 我们在沙盒模式下测试了它 为订阅者在订阅后增加了一个订阅计数器 仅当应用内购买成功后 即当我们收到 StoreKit 的反馈以启用高级功能时 才会触发此功能 现在
  • 修复使用 uploadify 时 django csrf 错误

    我在 django 管理中使用 uploadify 但收到 403 错误 当我使用 csrf exempt错误消失了 但是这是非常危险的 有没有更好的方法通过使用 csrf exempt 装饰器来解决这个问题而不损害管理页面 提前致谢 听起
  • 是否可以使用“firebase-admin”包调用 firebase 函数?

    我有带有基于服务帐户的访问权限的节点应用程序 所以我使用firebase admin 正如我之前所看到的 firebase admin大部分重复firebase包 除了身份验证部分 签名和其他一些部分 但现在我想调用函数 但找不到任何等效项
  • Spring 服务层的 JUnit 测试用例

    我正在尝试配置 JUnit 并为 Spring 3 2 MVC 应用程序的服务层编写测试用例 我找不到太多关于如何从头开始配置 JUnit 并使其适用于 Spring 服务层的信息 这是我的问题 我真的不知道要使用什么版本的 junit 所
  • 如何在构建时在maven中设置项目版本?

    我正在尝试在我们的项目中实现语义版本控制 我测试了 Maven semver 插件 但这对我没有帮助 所以请不要问我为什么 我最终使用了 Maven Groovy 它的工作原理就像一个魅力 但是 当我安装或部署 Maven 项目时 存储库中
  • PHP/GD - 透明背景

    我想结合 GD 在 PHP 中执行以下操作 不幸的是 ImageMagick 不是一个选项 但这似乎是一个常见问题 因此has作为一个解决方案 我似乎找不到它 我想创建一个具有透明背景的PNG 然后我想在上面画一个矩形 在上面复制一个图像
  • 了解 的上限和下限 ?在 Java 泛型中

    我真的很难理解通配符参数 对此我有几个问题 作为类型参数只能在方法中使用 例如 printAll MyList