类型化与原始数组列表的兼容性
在平常的使用中,我们可能愿意使用类型化的数组列表来增加安全性;但一旦我们遇到没有使用类型化的原始数组时,我们如何让两者进行交互操作呢?
package Test1;
import java.util.*;
public class t1 {
public static void main(String[] args) {
test1 t1=new test1();
ArrayList<Integer> list=new ArrayList<Integer>();
t1.a(list);
}
}
class test1
{
public void a(ArrayList list)
{}
public ArrayList b(String s){
return null;
}
}
在上面的代码中, 可以将类型化的list传递到方法a()中。
package Test1;
import java.util.*;
public class t1 {
public static void main(String[] args) {
test1 t1=new test1();
//ArrayList<Integer> list=new ArrayList<Integer>();
//t1.a(list);
ArrayList<Integer> list=new ArrayList<Integer>();
list=t1.b("result");
System.out.println(list);
}
}
class test1
{
public void a(ArrayList list)
{
}
public ArrayList b(String s){
ArrayList a1=new ArrayList();
a1.add(s);
return a1;
}
}
在上面的代码中,当我们将一个返回原始数组列表的方法赋给实现类型Integer的数组列表,这时编译器就会发出一条警告
类型安全:类型 ArrayList 的表达式需要进行未经检查的转换以符合 ArrayList<Integer>"
这些是由于编译器出于对兼容性的考虑,在堆类型转换进行检查之后,如果没有发现违反规则的现象,就将所有的类型化数组列表转换为原始ArrayList对象。在程序运行时,所有的数组列表都是一样的,即没有虚拟机中的类型参数。
当遇到警告时,只要确保警告不会造成严重后果就可以了。
在确定不会造成严重后果后,可以加上注释
@SuppressWarning("unchecked")ArrayList<Integer> list=t1.b("result");
package Test1;
public @interface SuppressWarning {
String value();
}