为什么可以使用方法将字符串元素添加到整数ArrayList

时间:2017-03-28 03:30:02

标签: java arraylist

据我所知, ArrayList的.add方法无法将String元素添加到整数ArrayList。 例如,

import java.util.ArrayList;


public static void main (String...args){
    ArrayList<Integer>lst = new ArrayList<Integer>();
    lst.add("ab");
    System.out.println(lst.get(0));
    }
}

无法编译。

但如果你是一个单独的方法,

import java.util.ArrayList;


public class Test {
    public static void addToList(ArrayList a){
    a.add("abcd");
    }

public static void main (String...args){

    ArrayList<Integer>lst = new ArrayList<Integer>();

    addToList(lst);
    System.out.println(lst.get(0));
    }
}

这将毫无问题地打印“abcd”。

为什么通过使用方法实际上可以将String添加到整数ArrayList?

4 个答案:

答案 0 :(得分:2)

在第二个示例中,在将ArrayList传递给方法时删除了泛型类型。

由于Java在运行时不强制执行泛型,因此您可以传递任何想要的内容,因为它只能用作Object

答案 1 :(得分:0)

  

为什么使用方法实际上可以将String添加到整数ArrayList?

这是因为在运行时,没有类型。类型擦除将发生,您的数组列表将变为通用。

在第一种情况下,编译器将检入。

为什么编译器在第二种情况下失败,因为你有一个带有类型

的arraylist
 public static void addToList(**ArrayList** a){
    a.add("abcd");
    }

因此你可以添加任何内容。

答案 2 :(得分:0)

欢迎来到java泛型的乐趣。答案是因为你不仅仅是将方法分开,而且还使用原始类型而不是ArrayList声明了方法。如果你在函数名中包含了它,它就不会编译,因为编译器能够检测到不匹配的类型。

之所以称为类型擦除,会发生什么是java字节代码实际上并不包含您提供给编译器的所有信息。字节代码只包含原始类型ArrayList,导致编译器错误的参数化是开发人员的便利,有助于防止类型转换相关的错误。因此,如果使用原始类型引用,您实际上可以自由地将任何类型的对象放入Collection中。不要这样做,因为你只是在寻找麻烦,坚持使用编译器辅助是最好的做法,原因很明显。

答案 3 :(得分:0)

在第二个示例中,原始类型变量a = new ArrayList<Integet>,就像subClass扩展超类一样,它可以调用属于超类的方法而不需要检查类型