有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将整数添加到字符串ArrayList?

List list = new ArrayList<String>() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);

上述代码有一个类型为List的引用,引用类型为StringArrayList的实例。当执行行list.add(1)时,1不是被添加到ArrayList(字符串类型)中吗?如果是,为什么允许这样做


共 (6) 个答案

  1. # 1 楼答案

    是的。。。1被添加到数组中,因为Java和其他语言一样,实现了原语数据类型的隐式(自动)转换(转换)

    更多信息请点击这里Conversions and Promotions

  2. # 2 楼答案

    当您声明这样的列表时: List list = new ArrayList<String>() ;

    您使用的是所谓的原始类型。它是一个具有泛型类型参数(如List)的类型,但您未能提供一个。如果您检查编译器警告,您将看到它正在告诉您这一点。将参数化类型与原始类型混合通常被认为是编程错误。这没关系:

    List<String> list = new ArrayList<String>() ;

    这还可以(但已经过时):

    List list = new ArrayList();

    但是你写它的方式应该避免

    问题是泛型只在编译器时被检查,并且您告诉编译器List,而不是List<String>,因此它将允许您在其中放入任何您想要的内容!右边有参数这一事实实际上并不意味着什么,编译器关心的是实际引用的类型

  3. # 3 楼答案

    您使用了类型擦除,这意味着您忽略了以前设置的常规检查。因为泛型是一种编译时特性,在运行时不会被检查,所以您可以不受影响

    你有什么一样的

    List list = new ArrayList() ;
    list.add(1) ;
    Integer hello = (Integer) list.get(0) ;
    System.out.println(hello);
    

    List<Integer> list = new ArrayList<Integer>() ;
    list.add(1) ;
    Integer hello = list.get(0); // generics add an implicit cast here
    System.out.println(hello);
    

    如果查看编译器生成的字节码,就无法区分它们之间的区别

    有趣的是,你可以做到这一点

    List<String> strings = new ArrayList<String>();
    @SuppressWarnings("unchecked");
    List<Integer> ints = (List) strings;
    ints.add(1);
    
    System.out.println(strings); // ok
    String s= strings.get(0); // throws a ClassCastException
    
  4. # 4 楼答案

    List list = new ArrayList<String>() ; // WARNING!!!
    

    不安全列表指的是安全的ArrayList

    list.add(1) ;  // WARNING!!!
    

    不是添加到列表中的字符串的整数(int 1转换为整数是自动装箱)

    Integer hello = (Integer) list.get(0) ;
    

    强制转换是必需的,因为不安全列表可以包含任何内容

    System.out.println(hello);
    

    整数。调用了toString()

    When the line list.add(1) is executed, isn't the 1 added to the ArrayList (of type String) ?

    对。整数已添加到假定包含字符串的ArrayList中

    If yes, then why is this allowed?

    向后兼容性。Java必须支持预泛型代码

    名单;意味着它不安全,因此您可以对它执行任何操作,而引用的ArrayList()必须容忍这种情况

    寓意:不要忽略编译器警告,否则Integer可能会进入假定包含字符串的ArrayList

  5. # 5 楼答案

    问题是list变量具有原始类型,您可以将任何类型的对象添加到此列表中。要解决此问题,只需将其声明为StringList

    List<String> list = new ArrayList<String>() ;
    
  6. # 6 楼答案

    它之所以编译,是因为声明List list使用原始类型List,而不是绑定类型List<String>。第二行编译是因为list变量可以接受任何内容。第三行编译是因为list.get(0)返回Object。第四行没有失败的理由

    意外地,编译代码中没有任何内容导致整数1被转换为String。但你不能依赖于此。第一行是正确的吗

    List<String> list = new ArrayList<>();
    

    您的错误会在编译时被发现