在原始类类型上忽略显式方法类型参数;编译器错误? [复制]

2023-12-14

我在调用具有显式类型参数的泛型方法时收到编译器错误,就好像未考虑显式类型参数一样。最小的例子:

class CastExample {
    static class ThingProducer<S> {
        public <T> T getThing() { return null; }
    }

    static class ThingA {}

    public static void main(String... args) {
        ThingProducer thingProducer = new ThingProducer();
        ThingA thingA = thingProducer.<ThingA>getThing(); // compile error here
    }
}

ThingProducer是一个原始类型,因为该类有一个类型参数,但在调用时getThing我们没有引用class类型参数,而是提供method类型参数。根据我对 JLS 的理解,这应该是合法的,但它给了我这个错误:

incompatible types: Object cannot be converted to ThingA

如果我这样做,错误就会消失

  • 去除<S> from ThingProducer
  • or make getThing static
  • declare thingProducer ThingProducer<?>而不是原始类型ThingProducer

这是编译器错误吗?如果不是,JLS 中的什么规则定义了这种行为?


Java 语言规范第 4.8 节回答你的问题:

未从其超类或超接口继承的原始类型 C 的构造函数(第 8.8 节)、实例方法(第 8.4 节、第 9.4 节)或非静态字段(第 8.3 节)的类型是对应于的原始类型删除对应于 C 的泛型声明中的类型。

在你的例子中,getThing()是原始类型 C 的“实例方法......”[在这种情况下,ThingProducer] 不是继承的”。根据 JLS,它的类型是“对应于泛型声明中其类型擦除的原始类型”。在泛型声明中getThing()它的类型T是无界的,这意味着它的擦除是java.lang.Object.

请注意,规范确实not比如说getThing()的类型是通过擦除它所属的原始类型而构造的类型(即ThingProducer)——实际上是擦除getThing()本身,这意味着两个类型参数 (T and S)被删除。

[旁白:在我原来的回答中,我引用了规范的另一句话:“将类型参数传递给不是从其超类或超接口继承的原始类型的非静态类型成员是一个编译时错误。”我最初读到这句话是编译器是required为上面的语法发出编译时错误,因为我得出的结论是您试图“将类型参数传递给原始类型的非静态类型成员”。但我改变了主意:我相信最后一句指的是非静态type成员(即嵌套类型),而不仅仅是非静态泛型成员。]

当然,如果不引用规范中的这一点,第 4.8 节的讨论就不完整:

仅允许使用原始类型作为对遗留代码兼容性的让步。强烈建议不要在 Java 编程语言中引入泛型之后编写的代码中使用原始类型。 Java 编程语言的未来版本可能会禁止使用原始类型。

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

在原始类类型上忽略显式方法类型参数;编译器错误? [复制] 的相关文章

  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • 是否有任何简单(且最新)的 Java 框架可用于在 Swing 应用程序中嵌入电影?

    我正在构建一个小型 Swing 应用程序 我想在其中嵌入一部电影 重要的是 这个应用程序是一个 WebStart 应用程序 并且该库应该能够打包在我启动的 jnlp 中 即 不依赖于本机库 我知道并尝试过 JMF 但我认为与其他框架相比 其
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • 使用 VBA 合并 Excel 工作表

    我有一个 Excel 工作表 例如 OG xls 其中已有一些数据 其中有大约 5000 行 标题位于第一行 最多为 AN 列 这个行数 5000 全年都不会改变 现在我有 5 个 XL 文件 比如 A B C D E 这些文件中的数据每次
  • 使用批处理根据分辨率重命名我的视频文件

    我想根据视频文件的分辨率重命名它们 例如 对于 1080p 的视频 bla bla mp4 我想将其重命名为 bla bla H 264 1080p 该脚本应该能够自动检测视频的分辨率 而且如果文件已经被重命名 则不应重命名它 我无法找到检
  • 使用 iPhone 在 UIView 中嵌入视频

    我想编写一个在视图中下载 或流式传输 视频 根据需要编码 的应用程序 我不想使用 SDK 中的 MPVideoPlayer 因为它会全屏打开视频 我想在视频上放置另一个 UIView 透明 以便我的用户可以在视频上进行注释 任何人有任何想法
  • 限制 App Engine 对自定义域中的 G Suite 帐户的访问

    不久前 Google Apps 现在称为 G Suite 域的 App Engine 相关设置已移至 Google Cloud Console 截至目前 限制关联 G Suite 用户访问 App Engine 实例的记录方法是通过此 Go
  • 在 Jquery 中选择元素之前的同级?

    DOM 看起来像这样 div A div div B div div C div div D div div E div div F div div G div 现在我可以选择 div D div using div selected 那么
  • setInterval at 1ms 似乎实际上不是 1ms

    我正在尝试使用 HTTPRequest 来计算下载文件所需的时间 如下所示 function getFile use strict var url data bin var rawFile new XMLHttpRequest var ti
  • Openssl 和 PHP

    我正在尝试使用 PHP 加载 openssl cli 工具生成的私钥 我使用了以下命令和 PHP 代码 openssl genrsa des3 4096 out private key if key openssl pkey get pri
  • 来自纬度经度位置的国家/地区代码(不使用地理编码服务)

    如何从纬度经度位置获取国家 地区代码 我知道有许多地理编码服务可用 但它们不能满足我的要求 因为我的应用程序在上线几个小时后就被阻止 许多地理编码请求 大多数地理编码服务还提供商业服务 但它们还不是一种选择 因为该项目还处于起步阶段 我做了
  • 拆分函数添加: \xef\xbb\xbf...\n 到我的列表

    我想打开我的file txt并从此文件中分割所有数据 这是我的file txt some data1 some data2 some data3 some data4 some data5 这是我的 python 代码 gt gt gt f
  • 如何在codeigniter中将时间戳转换为日期

    我想转换1373892900000 to Monday 2013 07 15 8 55 AM在代码点火器中 但是 通过使用我编写的函数转换时间戳 我不断收到完全不同的结果 请注意 我需要根据不同的时区更改日期 这就是为什么我想这样写 pub
  • jqGrid loadonce 不适用于 asp.net

    有谁知道如何用 asp net asmx jqGrid 排序解决这个讨厌的问题 因为 为了从 jqGrid 调用 pagemethods 或 asmx Web 服务 需要像这样进行攻击 datatype function ajax url
  • 如何通过 Javascript 设置循环 iMacros?

    1 我无法通过javascript添加设置循环imacros 我该如何添加它 var macro macro CODE macro VERSION BUILD 8011895 n macro TAB T 1 n macro SET ERRO
  • Android - 获取对 Manifest 中定义的 BroadcastReceiver 的引用

    有什么方法可以从代码中获取 Manifest xml 中定义的 BroadcastReceiver 的引用吗 就我而言 我们使用的 BroadcastReceiver 需要包含在 Manifest xml 中 然而 它具有我想在我们的代码中
  • 使用 typeahead 和 Bloodhound 单击时显示完整的建议列表

    我将 Typeahead js 与 Bloodhound 建议引擎一起使用 并希望用户在搜索框中单击后立即显示该列表 我发现了这个 stackoverflow 问题 Twitter TypeAhead 以编程方式显示所有结果 这与我相同 答
  • 与具有依赖关系的动态库链接

    考虑以下场景 共享库 libA so 没有依赖项 共享库 libB so 以 libA so 作为其依赖项 我想编译一个与 libB 链接的二进制文件 我应该仅将二进制文件与 libB 链接还是与 libA 链接 有没有办法只链接直接依赖项
  • 仅在有效文本选择的情况下启用 CKEditor 工具栏按钮?

    我正在开发一个 CKEditor 插件 用于注释文本和添加边距注释 但我希望仅当用户已经选择了一系列文本时才启用一些自定义工具栏按钮 每当用户打字或光标位于单个点 而不是范围 时 按钮 及其关联的命令 都应该被禁用 我是一位经验丰富的插件作
  • 导入错误:无法导入名称“Deque”

    我正在尝试在 Heroku 上托管我的 Discord py 机器人 当我的机器人启动时出现以下错误 2020 01 31T20 49 31 501236 00 00 heroku worker 1 State changed from s
  • 如何使用 git filter-repo 作为带有 Python 模块接口的库?

    我知道我在命令行中将 Python 代码作为字符串给出 例如 git filter repo name callback return name replace b Wiliam b William 但特别是当我进入更复杂的脚本时 这会变得
  • 无法加载库“libdl.so.2”

    我一直在尝试将 linux 编译的预构建共享库与我的 android jni 应用程序一起使用 但是当我尝试运行该应用程序时 它会出现以下错误 04 16 19 09 13 633 E dalvikvm 11810 dlopen data
  • 在原始类类型上忽略显式方法类型参数;编译器错误? [复制]

    这个问题在这里已经有答案了 我在调用具有显式类型参数的泛型方法时收到编译器错误 就好像未考虑显式类型参数一样 最小的例子 class CastExample static class ThingProducer