Java:如何从泛型类型获取类文字?

2024-01-06

通常,我见过人们像这样使用类文字:

Class<Foo> cls = Foo.class;

但是如果类型是通用的,例如列表?这工作正常,但有一个警告,因为 List 应该参数化:

Class<List> cls = List.class

那么为什么不添加一个<?>?好吧,这会导致类型不匹配错误:

Class<List<?>> cls = List.class

我认为这样的东西会起作用,但这只是一个简单的语法错误:

Class<List<Foo>> cls = List<Foo>.class

我怎样才能得到一个Class<List<Foo>>静态地,例如使用类文字?

I could use @SuppressWarnings("unchecked")消除第一个示例中由非参数化使用 List 引起的警告,Class<List> cls = List.class,但我宁愿不。

有什么建议么?


你不能因为类型擦除 http://java.sun.com/docs/books/tutorial/java/generics/erasure.html.

Java 泛型只不过是对象转换的语法糖。展示:

List<Integer> list1 = new ArrayList<Integer>();
List<String> list2 = (List<String>)list1;
list2.add("foo"); // perfectly legal

在运行时保留泛型类型信息的唯一实例是Field.getGenericType() http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#getGenericType()如果通过反射询问类的成员。

这一切都是为什么Object.getClass() http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#getClass()有这个签名:

public final native Class<?> getClass();

重要的部分是Class<?>.

换句话说,从Java 泛型常见问题解答 http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ106:

为什么没有具体参数化类型的类文字?

因为参数化类型没有精确的运行时类型表示。

类文字表示一个Class表示给定类型的对象。 例如,类字面量String.class表示Class代表类型的对象String并且与Class时返回的对象 方法getClass被调用于String目的。类文字可以 用于运行时类型检查和 供反思。

参数化类型失去其类型 当参数被翻译成 编译期间的字节码 过程称为类型擦除。作为一个 类型擦除的副作用,全部 泛型类型的实例共享 相同的运行时表示, 即相应的原始 类型 。换句话说,参数化 类型没有类型表示 他们自己的。因此,有 形成类文字没有意义 例如List<String>.class , List<Long>.class and List<?>.class,因为没有这样的Class对象存在。 仅原始类型List has a Class代表其运行时的对象 类型。它被称为List.class.

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

Java:如何从泛型类型获取类文字? 的相关文章

随机推荐

  • 另一个“连接被对等方重置”错误

    我正在使用套接字模块在 python 中创建服务器 客户端应用程序 并且出于某种原因我的服务器不断结束连接 奇怪的是 它在 Windows 中完美运行 但在 Linux 中却不行 我到处寻找可能的解决方案 但没有一个有效 下面是代码的清理版
  • .NET 4.7.2 ASP.NET WebForms 网站中的依赖注入 - 构造函数注入不起作用

    我们目前正在处理一个较旧的项目 ASP NET Web 表单网站 并尝试看看是否可以为其设置依赖项注入 需要强调的是 这不是一个 Web 应用程序项目 它是较旧的类型 即网站 目前它的目标是 NET 4 7 2
  • 如何反向路由静态文件?

    起初我有一个 Twitter 图标的链接 public images twitter icon png 但现在我想根据类型显示 Twitter Facebook 或 LinkedIn 图标 因此 我创建了一个 FastTag 它将类型作为参
  • 应用程序启动后无法立即使用 ShowCursor(FALSE) 隐藏鼠标光标

    我需要在应用程序启动后立即隐藏鼠标光标 我为此使用 ShowCursor FALSE 但通常在 ShowCursor FALSE 之后 光标仍保留在屏幕上 直到鼠标移动 我和其他人在 Windows XP 到 10 的不同 PC 上重现了这
  • MySQL中如何计算当前行与上一行之间的时间差

    我有这样的 mysql 表 t1 我想要做的是在所有行之间进行计算并将值保存在名为 diff 的新列中 TICKETID DATENEW DIFF 16743 12 36 46 0 16744 12 51 25 15 minute 1674
  • unescape后如何转义嵌入的JSON

    使用 Json NET 进行序列化时 我需要在之前反序列化时取消转义之后转义嵌入的 JSON 这意味着我根据以下 JSON 进行了转义this https stackoverflow com questions 39154043 how d
  • leetcode:使用链表将两个数字相加

    我正在尝试解决涉及链表的中级问题之一 它是这样的 给您两个表示两个非负整数的非空链表 这些数字以相反的顺序存储 并且每个节点都包含一个数字 将两个数字相加并以链表形式返回总和 您可以假设这两个数字不包含任何前导零 除了数字 0 本身 蟒蛇代
  • 不剪辑内容的剪辑路径

    我正在尝试使用剪辑路径创建形状背景 但我不想剪辑该 div 的子项 内容 这是代码 div webkit clip path polygon 0 57 100 21 100 100 0 100 clip path polygon 0 57
  • sonarRunner 权限不足错误

    我在运行声纳时遇到权限不足的错误 在我将 sonarQube 升级到 5 0 后 这种情况开始发生 错误 声纳运行程序执行期间出错 错误 无法执行声纳 错误 原因 无法装饰 org sonar api resources File 152f
  • 无法建立 SSL/TLS 安全通道的信任关系:根据验证过程,远程证书无效

    我有一个 ASP NET MVC Web 应用程序 它已经在生产环境中运行了大约 4 年 从大约一周前开始 我突然发现对第 3 方安全 API 的所有调用都返回此错误 System Net WebException 底层连接已关闭 可以 不
  • 如何仅使用 DOM 将所有元素上的一个类替换为另一个类?

    我只想将一个类名更改为另一个类名 我尝试过使用 document getElementsByClassName current setAttribute class none 但它不起作用 我是 JavaScript 新手 解释 docum
  • 关闭并重新打开 Realm 实例是否会影响性能?

    使用 SQLite 时 我通常每个应用程序都有一个 SQLiteOpenHelper 实例 并且我从不关闭它 因为它的数据库被许多其他类连续使用 关闭 重新打开它会更慢 更复杂 现在我正在研究 Realm 并且计划仅从数据访问对象访问 Re
  • 无法使用 php pdo 从数据库返回正确的行数

    我试图从数据库中的表返回行计数 但仍然得到错误的值 我需要行计数来处理分页的子集值 我的表中有 11 项 但我只返回 1 项并且不明白为什么 我的外部连接文件 try pdo new PDO mysql host localhost dbn
  • 比较两个 Joda-Time DateTime 对象

    我正在处理的事情与这里所问的非常相似 比较 Joda Time 时区 https stackoverflow com questions 15165788 compare joda time zones 15165833 noredirec
  • 对我的应用程序的大小感到困惑?

    我对我的应用程序的大小有点困惑 该文件夹和所有内容的大小为 25 9MB 在 Xcode 中存档后 它显示 估计 App Store 大小 49 8MB 有人知道这是为什么吗 Thanks 您是否正在为armv6和armv7进行编译 如果您
  • CSS 边框内的边框

    在 的帮助下CSS 三角形教程 http css tricks com snippets css css triangle 我学会了创建三角形 arrow down width 0 height 0 border left 20px sol
  • PostgreSQL - 使用子查询更新多个列值

    我需要能够使用子查询的结果更新表上的多个列 一个简单的例子如下所示 UPDATE table1 SET col1 col2 SELECT MIN ship charge MAX ship charge FROM orders WHERE c
  • 在 ASP.NET 中隐藏文本框

    我正在使用 ASP NET 3 5 和 C 在我的页面上 我需要有一个文本框 该文本框必须对用户不可见 但当您查看页面源代码时它必须在那里 原因是 另一个名为 Eloqua 的程序将查看页面源代码 并且它必须获取该文本框的值 该文本框的值将
  • 如何调用辅助构造函数中的方法?

    class foo val x Int def convertToInt z string do somthing to convert a string to an integer def this y string this conve
  • Java:如何从泛型类型获取类文字?

    通常 我见过人们像这样使用类文字 Class