gpt4 book ai didi

java - ArrayList 自动将其类型更改为 ArrayList

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:42 24 4
gpt4 key购买 nike

public void run(){
setFont("Courier-24");
//Define list as ArrayList<Integer>
ArrayList<Integer> list = new ArrayList<Integer>();
readList(list);
}

private void readList(ArrayList list){
list.add("Hello");
list.add(2);
println("list = "+list);
println("Type of list = "+list.get(0).getClass());
println("Type of list = "+list.get(1).getClass());
}

结果:

list = [Hello, 2]
Type of list = class java.lang.String
Type of list = class java.lang.Integer

这是我的代码和结果。我的问题是,Integer 类型的 ArrayList 怎么可能存储 String 对象?现在的列表类型是什么?这是什么机制?

最佳答案

Java 的泛型实际上并不改变底层的类或对象,它们只是提供(大部分)围绕它们的编译时语义。

通过将 ArrayList<Integer> 传递到需要 ArrayList(可以保存任何内容)的方法中,您将绕过编译器为您提供该类型安全的能力。

Java Generics Tutorial 解释了这一点,以及为什么 Java 以这种方式实现泛型。 This page ,特别关注它:

Generics were introduced to the Java language to provide tighter type checks at compile time and to support generic programming. To implement generics, the Java compiler applies type erasure to:

  • Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods.
  • Insert type casts if necessary to preserve type safety.
  • Generate bridge methods to preserve polymorphism in extended generic types.

Type erasure ensures that no new classes are created for parameterized types; consequently, generics incur no runtime overhead.

没有说明的是,这还允许使用 泛型编写的代码(例如您的 run )与不使用 泛型编写的代码(例如您的 readList )进行交互,这在向具有庞大库基础的非常完善的语言添加功能时非常重要(就像在向 Java 添加泛型时一样)。

关于java - ArrayList<Integer> 自动将其类型更改为 ArrayList <String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30493403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com