泛型是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) 这里用泛型就显的多余了