当前位置: 首页 > 面试题库 >

Java泛型中的擦除概念是什么?

袁康裕
2023-03-14
问题内容

Java泛型中的擦除概念是什么?


问题答案:

基本上,这是通过编译器技巧在Java中实现泛型的方式。编译后的通用代码实际上只使用java.lang.Object你谈论的任何地方T(或其他一些类型参数),并且有一些元数据告诉编译器它确实是通用类型。

当你针对通用类型或方法编译某些代码时,编译器会弄清你的实际意思(即,类型参数的含义T),并在编译时验证你做对了事情,但是发出的代码再次在讨论就java.lang.Object-编译器在必要时生成额外的强制类型转换。在执行时,a List<String>a List<Date>完全相同;多余的类型信息已被编译器擦除。

可以将其与C#进行比较,在C#中,信息将在执行时保留,从而允许代码包含typeof(T)等价于T.class-的表达式,但后者是无效的。(请注意,.NET泛型和Java泛型之间还有其他区别。)在处理Java泛型时,类型擦除是许多“奇数”警告/错误消息的来源。



 类似资料:
  • 通过使用泛型,我们可以在编译过程中检测到任何可能的错误。例如 当我们在Java1.5之前使用原始类型而不是泛型时,它需要显式转换。例如, 然而,对于泛型,会发生类型擦除。也就是说,类型信息在运行时丢失。如果,也就是说,JVM如何知道它在运行时检索的对象类型,是字符串对象还是person对象(上面由编译器生成的cast)。但这对泛型有效,这可能会导致运行时错误。 最后,Joshua Bloch在第1

  • 问题内容: 我是从Joshua Bloch的google I / O困惑者演讲中得到的。这是代码 这个main方法会引发异常,因为它是原始类型,因此in中的所有泛型都将被删除,因此最终调用而不是。 我的问题是,即使我打电话是不是应该把它调用的方法,因为由于类型擦除,这种方法是有效的并且是类型的不是? 问题答案: 被调用的方法是在编译时定义的,而不是在运行时定义的。 如果在构造函数调用中添加参数,则

  • 问题内容: 类型擦除应该擦除所有泛型信息…如果是这种情况,那么像GSON这样的库如何使用泛型来确定反序列化为哪种类型? 例如 这将反序列 化为 将反序列化为 因此以某种方式在运行时使用通用信息。 问题答案: 类型擦除不会擦除所有类型信息。它不会从类,字段,返回类型和参数定义中将其删除。保留以下示例中的类型信息: 这是可以通过反射实现的。您可以检查给定的是否是该类,将其强制转换为该类并获取类型信息。

  • 我有一个返回泛型的函数: 所以,当我试图匹配一个函数结果时,我的问题是: 我得到一个警告:“类型模式数组[CustomerInfo到[CustomerApplication到]]中的非变量类型参数CustomerApplication-DDTO未选中,因为它已被擦除消除。” 这是否意味着在Array[]中可以得到任何类型的数组?所以我已经阅读了关于ClassTag和TypeTag的文章,但是误解了

  • 问题内容: 我有超一流的Foo。还有一个扩展它的类Bar。 在Foo中的功能: 酒吧功能: 出现错误: 我究竟做错了什么? 问题答案: 您正在使用不兼容的类型覆盖该方法。也许您想做类似的事情: 功能在 和功能在酒吧:

  • 问题内容: 我一直在阅读有关内核中的Linux内核和CFS调度程序的信息。我遇到了 vruntime (虚拟运行时),这是CFS调度程序背后的核心概念。我从“ Linux Kernel Development ”以及互联网上的其他博客中读到,但无法理解 vruntime 背后的基本计算。是否 vruntime 属于特定进程或做它属于一组进程具有相同的 nice值 。什么是 加权因子 ,如何计算?我