方法与类型中的另一个方法具有相同的擦除

2023-12-06

为什么在同一个类中存在以下两个方法是不合法的?

class Test{
   void add(Set<Integer> ii){}
   void add(Set<String> ss){}
}

我得到了compilation error

方法 add(Set) 与 Test 类型中的另一个方法具有相同的擦除 add(Set)。

虽然我可以解决这个问题,但我想知道为什么 javac 不喜欢这个。

我可以看到,在很多情况下,这两种方法的逻辑非常相似,可以用单个方法代替

public void add(Set<?> set){}

方法,但情况并非总是如此。

如果你想有两个,这会很烦人constructors需要这些参数,因为这样你就不能只更改其中一个的名称constructors.


此规则旨在避免仍然使用原始类型的遗留代码中的冲突。

这是为什么不允许这样做的说明,取自 JLS。假设,在 Java 引入泛型之前,我编写了一些如下代码:

class CollectionConverter {
  List toList(Collection c) {...}
}

你扩展我的课程,像这样:

class Overrider extends CollectionConverter{
  List toList(Collection c) {...}
}

引入泛型后,我决定更新我的库。

class CollectionConverter {
  <T> List<T> toList(Collection<T> c) {...}
}

您还没有准备好进行任何更新,因此您离开了Overrider独自上课。为了正确覆盖toList()方法中,语言设计者决定原始类型与任何泛型类型“覆盖等效”。这意味着虽然您的方法签名不再正式等于我的超类的签名,但您的方法仍然会覆盖。

现在,时间过去了,您决定准备好更新您的课程了。但你搞砸了一点,而不是编辑现有的、原始的toList()方法,你add像这样的新方法:

class Overrider extends CollectionConverter {
  @Override
  List toList(Collection c) {...}
  @Override
  <T> List<T> toList(Collection<T> c) {...}
}

由于原始类型的重写等效性,这两种方法都采用有效的形式来重写toList(Collection<T>)方法。但当然,编译器需要解析单个方法。为了消除这种歧义,类不允许有多个重写等效的方法,即擦除后多个方法具有相同的参数类型。

关键是这是一个旨在保持与使用原始类型的旧代码的兼容性的语言规则。它不是擦除类型参数所需的限制;因为方法解析发生在编译时,所以将泛型类型添加到方法标识符就足够了。

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

方法与类型中的另一个方法具有相同的擦除 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo

随机推荐

  • 传奇中的公共交通延迟响应

    我正在研究在公共交通中使用传奇来协调跨多个服务的活动 传奇的生命周期很短 如果一切顺利的话不到 2 秒 对于我的用例 我想使用请求 响应方法 即客户端请求命令 saga 处理该命令 在接收消息时经历一些状态更改 并最终响应启动 saga 的
  • 添加同一片段的多个实例

    我正在尝试将同一片段的多个实例添加到活动中 示例代码是 FragmentManager fm getSupportFragmentManager Fragment fragment fm findFragmentById R id frag
  • 对象... 是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 中的 是什么意思 Java 数组参数 声明 语法 谁能确认我所看到的是否正确Object 下面的方法调用中的参数 public static void setValues PreparedS
  • 使用 opencv 计算虚拟相机的单应性

    我有一个平面图像 我想计算一个图像扭曲 它可以为我提供从位于 3d 空间中另一个点的虚拟相机看到的同一平面的合成视图 因此 给定图像 I1 我想计算代表从虚拟相机看到的图像 I1 的图像 I2 理论上 存在将这两个图像关联起来的单应性 给定
  • 如何使 LinearLayout 可滚动?

    我的屏幕上有很多项目 我需要使用滚动条 以便用户可以向下滚动 但是 滚动条要么不可见 要么不起作用 如何给页面添加滚动条LinearLayout 用 a 包裹线性布局
  • 如何在 Perl 中从 HTML 中提取 URL 和链接文本?

    我之前问过如何在 Groovy 中做到这一点 但是 由于所有 CPAN 库 现在我正在用 Perl 重写我的应用程序 如果页面包含这些链接 a href http www google com Google a a href http ww
  • 如何设置网站图标?

    我正在尝试做一个非常简单的初步练习来建立一个创建网站图标的网站 这是我正在使用的代码 但它不起作用 有人可以帮忙吗 我已将文件 favicon ico 保存在与 html 文件相同的级别 在子目录中 非常感谢 随着 i android wi
  • 什么是 .pid 文件以及它包含什么?

    我最近遇到了一个扩展名为 pid 的文件 并查看了它的内部 但没有找到太多内容 这文档 says Pid 文件是包含进程标识号 pid 的文件 该文件存储在文件系统的明确定义位置 从而允许其他程序找到正在运行的脚本的 pid 任何人都可以对
  • 关于 Objective-C/Cocoa 中工厂方法对象生命周期的问题(保留或不保留...)

    通过阅读 SDK 中的内存管理文档 我发现工厂方法 静态构造函数方法 通常会为我保留该对象并将其添加到自动释放池中 这意味着只要池没有在我预期之前释放 我就不需要保留和释放对象 对于 main 中的默认自动释放池 这应该位于应用程序的末尾
  • 在多个号码字段中搜索多个号码

    ID 1 5 1 6 3 4 1 36 1 我有这些 1 6 36 要搜索的号码 它应该找到包含 1 OR 6 OR 36 的任何行 例如上表中总共 4 行 I tried FIND IN SET ID 1 6 36 ID IN 1 6 3
  • AngularJs 无限循环

    以下index html页面导致无限循环 重现 在 本地或远程 Web 服务器上下载下面链接的 github 项目 我已经在 plunker 上尝试过 并且没有发生无限循环 从您的浏览器请求它 单击页面上的 p1p2 链接 无限循环开始 在
  • MySQL5.6卡在进程“试图启动服务”上

    我获得了适用于 Windows 7 32 位的 MySQL 5 6 社区服务器版本 还下载了相同 Windows 版本的 Windows 安装程序 一切准备都正确 我在博客上看到给我一份在 winodws7 32 位上安装 MySQL 5
  • 如何找到向量的重复元素并输出该重复项的整数外观而不是逻辑值?

    我们知道 duplicate 函数输出一个逻辑向量 然而 我想要的是一个整数向量 如果这是该特定元素第 n 1 次出现 则输出向量的相应元素为 n 例如 如果我们调用我正在寻找的函数 intDuplicate 那么我需要以下输出 gt x
  • 在 C 中从文件中读取长行时处理内存

    首先 我知道这个问题非常接近这个话题 但是这个问题的措辞非常糟糕 我什至不确定它是重复的 而且没有显示代码 所以我认为应该正确地询问它 我正在尝试逐行读取文件 并且我需要将一行特别存储在variable 我已经成功地使用轻松地做到了这一点f
  • android:如何使用模拟(假)坐标修复GPS?

    当 GPS 信号不可用时 我尝试以编程方式修复 GPS 我想这样做是为了向其他应用程序 如谷歌地图和其他应用程序 提供模拟坐标 我尝试使用 GPS PROVIDER 和 NETWORK PROVIDER 但只有后者我才能获得对谷歌地图有效的
  • 错误:无法获取现有工作区:container.Client#ListBlobs:

    Error Failed to get existing workspaces containers Client ListBlobs Failure responding to request StatusCode 403 Origina
  • Laravel 路由变化

    我有一个类别表 如下所示 id parent id name 1 0 electronics 2 1 Televisions 3 2 LCD TVs 4 2 Plasma Tvs 5 1 DVD Players 6 1 Bluray Pla
  • HTML5 - 一起开始音频和视频?

    我该如何让音频和视频同时开始使用
  • 当我调用函数而不将其返回值分配给变量时会发生什么? [复制]

    这个问题在这里已经有答案了 假设我有以下功能 int foo return 1234 调用此函数而不将其返回值分配给任何变量的效果是什么 foo 另外 使用运算符而不将其返回值分配给任何变量的效果是什么 1 2 3 在 C 中 表达式是有效
  • 方法与类型中的另一个方法具有相同的擦除

    为什么在同一个类中存在以下两个方法是不合法的 class Test void add Set