java - 如有必要,插入类型转换以保持类型安全

标签 java generics casting type-erasure

如官方教程generics type erasure ,这个说法让我很困惑。 类型转换插入到底什么时候可能发生?我尝试使用泛型的一些简单用法并使用 javap -c a.class 来检查字节码,但似乎没有按照我的预期插入类型转换。

所谓的重复更多的是关于使用类型转换来确保存在适当的多态性桥接方法,而我想知道第二个语句的确切含义。

Insert type casts if necessary to preserve type safety.

可以举个例子来证明一下吗?

最佳答案

最后我觉得Jon Skeet's answer澄清了困惑。

when generics are used, they're converted into compile-time checks and execution-time casts.

当我们尝试编译a.java并反编译a.class时,我们将看到魔法(编译器帮助自动插入类型转换)。

    List<String> list = new ArrayList<>();
    list.add("hell");
    out.println(list.get(0));

反编译后:

    ArrayList var3 = new ArrayList();
    var3.add("hell");
    System.out.println((String)var3.get(0));
<小时/>

Using Legacy Code in Generic Code来自官方通用教程:

... whenever the resulting code isn't type-correct, a cast to the appropriate type is inserted...

关于java - 如有必要,插入类型转换以保持类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55084504/

相关文章:

java - 无法通过类中的 Runnable 访问全局变量

Java Lambda : Sending method name as parameter

typescript - 有没有办法在 TypeScript 中使用基于现有常量的计算字符串来声明联合类型?

c# - 如何在泛型方法中调用 Action<T> 参数?

c# - C#中的错误转换

go - Go 中的函数类型 - 将特定类型转换为更通用的类型

java - 如何在 Oracle 10gR2 和 JPA 中做到不区分大小写和不区分重音?

java - 包裹:无法编码值 android.util.Pair

c# - C# 中的继承 - 简单问题

c++ - 调用函数时防止转换 int