为什么强制转换为泛型类型会生效?

2024-04-08

On 重温Java http://javarevisited.blogspot.tw/2011/09/generics-java-example-tutorial.html,代码摘录如下:

class Holder<T>{
  private T[] contents;
  private int index = 0;
  public Holder(int size){
    //contents = new T[size]; //compiler error - generic array creation
    contents = (T[]) new Object[size]; //workaround - casting Object[] to generic Type
  }...}

它用于通用数组创建,但根据类型擦除(我在java在线教程上检查过),T结束为Object在课堂上编译,所以演员(T[])会结束成(Object[]),这似乎需要与不铸造没有区别.

那么这个铸件的作用是什么,或者铸件有什么特殊意义吗?任何提示都是值得感激的。


需要进行强制转换来告诉编译器我们这边的分配是正确的。否则它会显示编译器错误。

由于类型擦除,类型参数T被编译时的擦除所取代。 无界类型参数的擦除是Object,而有界类型参数的擦除是表示上限的类型。因此,如果类中的类型参数有上限 -Holder<T extends Number>,然后擦除TNumber。这意味着,T将被替换为Number由编译器。

所以,在这种情况下,自从T在无界中,它的擦除是Object。所以,它被替换为Object由编译器。

即使转换消除了编译器错误,编译器仍然会向您显示未检查转换的警告。因为,强制转换不是类型安全的,并且会在运行时失败ClassCastException如果您使用实例化泛型类型String类型参数。

尝试这个:

Holder<String> stringHolder = new Holder<>(5);
String[] contents = stringHolder.getContents();  // ClassCastException

创建通用数组的更安全方法是使用Array.newInstance方法。你需要通过Class<T>参数传递给构造函数,然后使用以下代码:

public Holder(int size, Class<T> clazz){
    contents = (T[]) Array.newInstance(clazz, size);
}

在这里您还将看到Unchecked Cast警告。但这是无害的。

更安全的方法根本不是创建一个其组件类型是类型参数的数组。你可以使用ArrayList<T>反而。


参考:

  • Java 通用常见问题解答 - Angelika Langer http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#Can%20I%20create%20an%20array%20whose%20component%20type%20is%20a%20type%20parameter?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么强制转换为泛型类型会生效? 的相关文章

  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • 在浏览器刷新中刷新检票面板

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

随机推荐

  • wcf 配置文件与代码配置的优缺点

    我有一个自托管 C WCF 服务 它为各种目的创建 20 多个端点 每个都在代码本身中配置 并在服务的 app config 中使用一些基本配置项 例如端口和地址 该服务对于经过测试的客户来说效果很好 但尚未经过广泛测试 我对标准 wcf
  • 休眠:刷新、驱逐、复制和刷新

    我希望我知道这个列表中的每个项目到底是什么 它是如何工作的 后果是什么以及什么时候是正确的使用时间 Refresh Evict 复制 Flush 我什至想知道每个人的作用 但我不太确定 所以我请求你的帮助 因为我真的很想了解它 我知道这是一
  • 使用 Javascript SDK 创建 Parse.File

    我遵循了法律条文 Javscript SDK 以及许多变体 但到目前为止我还无法将图像保存到 Parse File 我开始认为这是他们在放弃平台之前从未完成的代码 这是我的错误 无法构造 文件 需要 2 个参数 但仅存在 0 个 这是我的代
  • Rails/PostgreSQL - 查询更新所有日期添加 1 天

    我想执行 update all 查询来更新日期时间列 在所有行上将该列的当前值添加 1 天 我可以使用 each 和 update 来实现这一点 但在单个查询中执行会更有效 使用 Rails 和 PostgreSQL 可以实现这一点吗 UP
  • UnicodeDecodeError:“utf-8”编解码器无法解码位置 1 中的字节 0x8b:在 pandas 中读取 csv 文件时起始字节无效

    我知道类似的问题已经被问过 我已经看过所有这些问题并尝试过 但没有什么帮助 我正在使用 OSX 10 11 El Capitan python3 6 虚拟环境 也尝试过没有它 我使用的是jupyter笔记本和spyder3 我是 Pytho
  • java.lang.IllegalArgumentException:只能使用低 16 位作为 requestCode

    我正在写一个应用程序 其中Activity A发射Activity B using startActivityForResult intent 101 但当调用时 它会返回以下错误日志 E AndroidRuntime 1708 java
  • ASP.NET MVC 中的依赖下拉列表

    目前我有两个表 团队和员工 我正在完美填充团队的下拉列表 接下来我尝试根据员工团队的 selectedId 填充第二个下拉列表 控制器 GET CalView public ActionResult Index string ses str
  • 使用 Eigen 库存储 3D 数据

    如何使用 Eigen C 库存储 3D 数据 矢量用于 1D 数据 矩阵用于 2D 数据 但什么是 3D 数据 或者是否可以创建矩阵向量 您可以使用张量模块 但它还不稳定 Eigen Tensor
  • 在内核中添加新的 IOCTL(数字范围)

    我正在编写新的内核模块 并添加实现新的 IOCTL IOCTL 的编号是否应该遵循任何规则 也许有一些 用户范围 我在嵌入式平台上使用内核 2 6 21 IOCTL 被定义为与设备相关的 如果有 标准 ioctls 供人们实现 这些将是像这
  • 如何在 Xamarin.Mac 中捕获应用程序级别的按键事件

    我有一个 Xamarin Forms 应用程序 并使用主窗口中的 PreviewKeyDown 事件成功捕获 WPF 中的应用程序级别按下事件 如何在 AppDelegate 或其他方式中对 Xamarin Mac 执行相同的操作 您可以添
  • 如何在先前输入后使用 C++ 中的“获取”函数?

    我尝试输入数据gets 函数 但每当程序执行到留置权时gets 它会忽略它 当我使用gets 没有之前的数据输入 它可以正常运行 但是当我在输入数据后使用它时 就会出现问题 这是在先前的数据输入之后使用它的代码 因此在执行中我无法将数据输入
  • 如何保护我的 AngularJS 和 Web Api 应用程序

    我在 ASP NET Web Api 服务器端使用 AngularJS 在我看来 身份验证现在已经变得轻而易举了 或者这太好了以至于令人难以置信 所以我正在考虑使用Web Api的 个人用户帐户 身份验证 我想这就是我所需要的 只要每个请求
  • Keras 张量 - 使用来自另一个张量的索引获取值

    假设我有这两个张量 valueMatrix 形状为 3 where 是批量大小 indexMatrix 形状为 1 我想从中检索值valueMatrix在包含的索引处indexMatrix 示例 伪代码 valueMatrix 7 15 5
  • ANTLR4 Lexer 错误报告(违规字符的长度)

    我正在使用 ANTLR4 为某些语言开发一个小型 IDE 并且需要在词法分析器无法匹配错误字符时给它们下划线 内置的org antlr v4 runtime ANTLRErrorListener http www antlr org api
  • 从 JavaScript 到 PHP 的数据传输

    如何获取 PHP 浏览器的高度和宽度 就像从 JavaScript 到 PHP 的数据传输一样 随着使用innerHeight and InnerWidth 我认为 如果用户屏幕尺寸小 我只需要显示小图片 如果屏幕尺寸大 我只需要显示大图片
  • PHP post方法无法从url获取数据

    我有一个 URL 用于在浏览器中粘贴并按 Enter 键后获取发布数据 我的链接是 http vtrails us mixtape builder song urls http vtrails us wp content uploads 2
  • 如何在 Unity3D 中编辑动画

    我在层次结构中选择了一个带有动画组件的游戏对象 不是动画师 而是一个简单的动画 然后我尝试通过从 窗口 菜单中选择 动画 来打开动画窗口来编辑它 问题是动画窗口变灰 建议我创建一个新动画 但我只想编辑我已经拥有的一个 要编辑动画 您需要选择
  • 在 Swift 中追加字符串

    我是 iOS 新手 我目前正在使用 Objective C 和 Swift 学习 iOS 要在 Objective C 中附加字符串 我使用以下代码 NSString string1 This is NSString string2 Swi
  • getIntent() 和从 savingInstanceState 获取意图有什么区别?

    大家好 我正在尝试 Android 在 2 个类之间传递意图 我意识到有 2 种传递意图的方法 第一个是在这里使用 getIntent 方法 Bundle extras getIntent getExtras mRowId extras n
  • 为什么强制转换为泛型类型会生效?

    On 重温Java http javarevisited blogspot tw 2011 09 generics java example tutorial html 代码摘录如下 class Holder