据我所知, 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?
答案 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扩展超类一样,它可以调用属于超类的方法而不需要检查类型