泛型请不要使用原生态类型
泛型是java1.5引进来的,什么是泛型我就不多说了。
什么是原生态类型:
这是原生态的,没有<>
List list = new ArrayList<>();
这是非原生态的,即有<>
List<String> list = new ArrayList<>();
泛型的作用有两点
1.编译时检查我们所放入的对象是否是泛型中的类型
2.取出时自动编译成泛型的类型
public static void main(String[] args) {
//在这里我们用的泛型是String
List<String> list = new ArrayList<>();
//当在集合中添加不是String类型的对象时就会编译不通过
list.add("a");
//取出来的对像直接就是String类型
String s = list.get(0);
//在这里我们用的原生态
List list1 = new ArrayList<>();
//可以随便放入对象
list1.add("a");
//我们放进去的是String,取出来的是Object
Object o = list1.get(0);
//要想得到我们放进去的String类型,还得进行转换
String s1 = String.valueOf(o);
}
原生态类型跳过了编译检查,是不安全的.
public static void main(String[] args) {
//在这里我们用的泛型是String
List<String> list = new ArrayList<>();
//这里参数要求是List<Object>,其实参数是List<String>类型不一致,报编译错误
main1(list,"a");
//这里参数要求是List原生态类型,List<String>是他的子类型,编译可以通过。
main2(list,"a");
String s = list.get(0);
}
//如果表示泛型是任意类型可以选择List<Object>,也会进行安全检查
public static void main1(List<Object> list,Object a) {
list.add(a);
}
//原生态类型跳过了参数检查
public static void main2(List list,Object a) {
list.add(a);
}
当我们在一个方法的参数里面不确定泛型的类型时,可以用通配符?来代替
public static void main3(List<?> list) {
Object o = list.get(0);
}
毫无疑问,他也是有安全检查的。
使用原生态的例外情况
1.表示class类的时候必须使用原生态 List.class
2.instance of的使用下 if(o instance List) 这里用泛型就显的多余了