有界通配符和类型参数有什么区别?

2023-12-02

之间有区别吗

<N extends Number> Collection<N> getThatCollection(Class<N> type)

and

Collection<? extends Number> getThatCollection(Class<? extends Number>)

它们公开了不同的接口和方法契约。

第一个声明应返回一个集合,其元素类型与参数类相同。编译器推断类型N(如果未指定)。因此,当使用第一个声明时,以下两个语句是有效的:

Collection<Integer> c1 = getThatCollection(Integer.class);
Collection<Double> c2 = getThatCollection(Double.class);

第二个声明没有声明返回的 Collection 类型参数与参数类之间的关系。编译器假设它们不相关,因此客户端必须将返回的类型用作Collection<? extends Number>,无论参数是什么:

// Invalid statements
Collection<Integer> c1 = getThatCollection(Integer.class);   // invalid
Collection<Double> c2 = getThatCollection(Double.class);   // invalid
Collection<Number> cN = getThatCollection(Number.class);   // invalid

// Valid statements
Collection<? extends Number> c3 = getThatCollection(Integer.class);  // valid
Collection<? extends Number> c4 = getThatCollection(Double.class);  // valid
Collection<? extends Number> cNC = getThatCollection(Number.class);  // valid

推荐

如果返回的类型参数和传递的参数之间确实存在类型关系,则最好使用第一个声明。如上所述,客户端代码更加清晰。

如果这种关系不存在,那么最好避免第二次声明。具有有界通配符的返回类型迫使客户端在任何地方使用通配符,因此客户端代码变得混乱且不可读。约书亚·布洛赫 (Joshua Bloch) 强调你应该避免返回类型中使用有界通配符(幻灯片 23)。虽然返回类型中的有界通配符在某些情况下可能很有用,但恕我直言,结果代码的丑陋应该会覆盖它的好处。

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

有界通配符和类型参数有什么区别? 的相关文章

  • java 拖放

    我尝试熟悉java中的拖放 但我发现的所有教程都是 让我生气 我想要的只是从 JList 包含在名为 UserPanel 的自制 JPanel 中 拖动 PublicUserLabel 并将其放入从 JTabbedPanel 继承的自制类中
  • Selector.close() 是否关闭所有客户端套接字?

    我是 nio 套接字的新手 我已经使用 nio 套接字编写了一个服务器 现在我正在尝试编写关闭钩子以确保通过清理资源正常退出 我的问题是Selector close 方法关闭所有客户端套接字 如果没有 请告诉我如何访问所有客户端套接字 而无
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • Android Studio 与 Google Play 服务的编译问题

    我正在运行 Android Studio 0 8 4 并在 Android Studio 0 8 2 上尝试过此操作 我正在运行 Java JDK 1 8 0 11 并尝试使用 JDK 1 8 0 05 每当我尝试构建我的 android
  • 使用 Spring MVC 在 jar 文件中显示 jsp 页面

    我正在使用 Spring MVC 3 2 2 在 java 中开发一个 Web 应用程序 我在从 jar 文件中加载 jsp 页面时遇到问题 Spring MVC Web应用程序具有以下结构 META INF WEB INF spring
  • 清空变量不会使方法引用无效[重复]

    这个问题在这里已经有答案了 为什么代码不抛出NullPointerException当我使用与变量绑定的方法引用时dog我后来分配了null to 我正在使用 Java 8 import java util function Functio
  • 如何在正则表达式中编写可选单词?

    我想编写一个识别以下模式的 java 正则表达式 abc def the ghi and abc def ghi 我试过这个 abc def the ghi 但是 它没有识别第二种模式 我哪里出错了 abc def the ghi 删除多余
  • java:为什么主线程等待子线程完成

    我有一个简单的java程序 主线程 main 创建并启动另一个线程t class T extends Thread Override public void run while true System out println Inside
  • JFrame 在连续运行代码时冻结

    我在使用时遇到问题JFrame 它会冻结 连续运行代码 下面是我的代码 点击时btnRun 我调用了该函数MainLoop ActionListener btnRun Click new ActionListener Override pu
  • java绕中心旋转矩形

    我想围绕其中心点旋转一个矩形 它应该保留在应该绘制的位置并在该空间中旋转 这是我的代码 AffineTransform transform new AffineTransform transform rotate Math toRadian
  • 为休息服务实施 JUnit 测试

    我必须为我的休息服务实现一些 JUnit 测试 例如 这是我的休息服务之一 Path dni fe public class HelloWorld POST Path home Consumes MediaType APPLICATION
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • 如何在 JmsMessagingTemplate.sendAndReceive 上设置等待超时

    我在 MVC 控制器中使用 JmsMessagingTemplate 的 sendAndReceive 但如果没有发送回复消息 它似乎会永远等待回复 该文档指出 返回 回复 如果无法接收消息 例如由于超时 则可能为 null 然而 我只是不
  • 在 Eclipse RCP 应用程序中禁用插件贡献

    我经常遇到这个问题 但尚未找到解决方案 每当我编写一个新的基于 Eclipse RCP 的应用程序并包含来自 Eclipse 平台的插件时 我都会 继承 其中一些插件的 UI 贡献 大多数贡献 菜单项 键盘快捷键 属性页 都很有用 但有时我
  • 在 Kotlin 中声明静态属性?

    My Java code public class Common public static ModelPengguna currentModelPengguna public class Common companion object v
  • log4j.properties 在 Wildfly 上无法正常工作

    我的类路径中有一个 log4j properties 文件 它位于 APP XX jar log4j properties 位置 我注意到在ear文件中我还可以在lib文件夹中找到log4j 1 2 17 jar 但无论我在 log4j p
  • 如何在不使用 -cp 开关的情况下在 Groovy 中自动加载数据库 jar?

    我想简化调用 Oracle 数据库的 Groovy 脚本的执行 如何将 ojdbc jar 添加到默认类路径以便我可以运行 groovy RunScript groovy 代替 groovy cp ojdbc5 jar RunScript
  • Spring MVC:通用 DAO 和服务类

    我正在 Spring MVC 中编写网页 我使用 Generic DAO 编写了所有 DAO 现在我想重写我的服务类 我该如何写 通用服务 我的 DAO 如下 DAO package net example com dao import j
  • FetchType.LAZY 不适用于休眠中的 @ManyToOne 映射

    简而言之 我的 Child 类与 Parent 类之间存在多对一的关系 我想加载所有的孩子 而不必加载他们的父母详细信息 我的孩子班级是 Entity public class Child implements Serializable I
  • Graphics2D setfont() 严重减慢了 java 应用程序的启动速度

    我正在用java制作一个游戏 它每秒刷新60次 每次执行循环时 我都会使用 g2d 来绘制图像和字符串 如果我这样做的话一切都会很好g2d setFont new Font Arial Font PLAIN 8 和抽绳 这将是正常的 但如果

随机推荐

  • Magento:获取订单Id,监听事件checkout_onepage_controller_success_action

    当我看到这个事件的时候checkout onepage controller success action并且有效 但我无法获取新创建的订单的 ID 有人有什么想法吗 使用magento 1 4 1 0 Thanks 该事件的发送方式如下
  • 当集合使用不同的 X 坐标范围时,iOS 图表将不会绘制多个数据集

    当从多个数据集创建折线图时 折线图仅显示其中一个数据集 并且在缩放或平移图表时会崩溃致命错误 无法形成 upperBound 如果我从一个数据集创建折线图 它会按预期工作 仅当两个数据集具有完全不同的 X 值范围时 才会出现此问题 下面的代
  • iOS:给定一个圆导出点击点的角度

    我有一个 UIImageView 显示一个分为六个相等三角形的圆 对应于 区域 1 0 60 度之间 区域2 gt 60 120度之间 区域3 gt 120 180度之间 区域4 gt 180 240度之间 区域5 gt 240 300度之
  • 如何将值从react-native发送到android活动?

    我想将 rowId 从 React Native Listview 发送到我的 Android 活动中的方法之一 原因是我正在将 React 集成到现有的 Android 应用程序 所以暂时我想发送 rowID 进行进一步处理 对此有什么想
  • Visual Studio 未在解决方案资源管理器中显示提交的文件

    I have committed files in Visual Studio and pushed them to a repo on Github Now i pulled the repo but the committed file
  • 将 SQL 子查询转换为 In to Linq Lambda

    如何将以下 SQL 语句转换为 Lambda 表达式或 Linq 查询 以下查询获取每个问题的最新答案 或者换句话说 为每个问题提供最新的答案 这也将由实体框架执行 SELECT Answers FROM Answers Where Ans
  • git 除了子目录及其被忽略目录的文件

    我使用 git 来管理我的源 我在以下路径中有一些文件 Debug a dll Debug b exe Debug c png Debug Pic a png Debug Pic b bmp Debug Pic c dll 我想忽略这些文件
  • JavaScript 中的 + + 运算符

    当我有一个加号时 我会得到错误的答案 例如 var b 069 var total 0 total total b console log total total 069 然而 当我添加第二个加号时 方程看起来像这样 total total
  • ggplot轴标题中斜体和上标的表达

    我很抱歉问这个问题 但我似乎无法正确地将这个表达式包含在ylab or xlab ggplot2 对象的参数 需要读一下 2q 稀有 不过 2 需要加上上标 我摆弄过expression and paste 但这似乎是不可能的 任何帮助深表
  • IEnumerable 到 FileStreamResult 的流

    我有一个IEnumerable
  • 删除文件权限被拒绝

    我遇到了 Stack Overflow 上有很多条目的问题 但没有一个解决了我的问题 我有这段代码 它尝试删除文件夹中的每个 txt 但我在 DeleteFile 命令上不断收到权限被拒绝的错误 directory C TEST FOLDE
  • Moodle注册表编辑

    我使用的是moodle 2 8 1 我的疑问是关于 Moodle 注册表 我想添加一个确认密码字段 该字段与电子邮件 再次 字段相同 并删除电子邮件 再次 字段 而且它也没有显示电话号码 注册表单中的字段处于解锁状态时 如果要向注册表单添加
  • 接收POST时出现404错误

    我需要使用 php 将 json POST 从 android 发送到 Web 服务器 我尝试了很多代码但不起作用 现在我尝试使用 Postman 进行简单的 POST 无论是否发送数据 并且总是收到404错误 如果我使用 GET 发送数据
  • 为什么多个类选择器不能与removeClass一起使用

    如何在一个声明中使用多个类来完成这项工作 div class ddd back7 d div div class fff back7 f div div class ggg back7 g div ddd fff ggg removeCla
  • 返回重复字母最多的第一个单词

    这是 coderbyte 的 Easy Set 中的一个问题 很多人已经问过这个问题 但我真的很好奇我的特定解决方案出了什么问题 我知道这是一个非常愚蠢且低效的解决方案 原问题 让函数 LetterCountI str 接受传递的 str
  • 从多个接口继承的方法上的 List 返回类型中的 Java 泛型

    我目前在一家拥有多种模块的公司工作 在该公司中 如果您想提供模块内部结构 您可以通过 java 接口提供它 该接口隐藏实际的实现类型并为请求模块提供接口 现在我希望有一个提供程序能够为多个模块提供数据 这些模块公开实际内部数据的不同字段或方
  • 逐行乘以数据框

    输入文件 df1 lt data frame row names c w x y z A c 0 0 0 0 B c 0 1 0 0 C c 1 0 1 0 D c 1 1 1 1 A B C D w 0 0 1 1 x 0 1 0 1 y
  • MVC 失去焦点时需要进行字段验证

    ASP NET MVC 必需 验证仅在以下条件之一触发 1 表格提交2 按 Tab 键进入字段 gt 输入一些文本 gt Tab 退出 gt Tab 返回字段 gt 删除文本 gt Tab 退出 我想以这种方式触发 if 按 T ab 键进
  • 温斯顿记录器不写入文件

    我想用winston登录node用于将错误记录到文件的应用程序 但winston不写入文件 var logger new winston Logger transports new winston transports Console ne
  • 有界通配符和类型参数有什么区别?

    之间有区别吗