List在开发中的重要性相信做开发的小伙伴都清楚,日常开发中对于List的几种书写方式的区别不是很清楚
代码语言:javascript复制本小节对List和List<T>以及List<?> 来做一个总结
List完全没有类型限制和赋值限制,如果天马行空的乱用,迟早会遭遇类型转换失败异常
代码语言:javascript复制 @Test
public void test(){
List list = new ArrayList();
list.add(141342);
list.add("1233");
list.add(908L);
list.stream().forEach(i-> System.out.println(i));
List<Object> list1= new ArrayList<>();
list1 = list; // 这样赋值是没有问题的
list1.stream().forEach(j-> System.out.println(j));
}
显示结果:
141342
1233
908
List<?>: ?是通配符,是一个泛型,在没有赋值之前,表示它可以接受任何类型的集合赋值,赋值之后就不能随便往里添加元素了,一般作为参数来接收外部的集合,或者返回一个不知道具体元素类型的集合
代码语言:javascript复制 @Test
public void generic(List<?> list){
List<Integer> list4 =new ArrayList<>();
list = list4
}
代码语言:javascript复制 @Test
public List<?> generic1(){
List<Integer> list =new ArrayList<>(); // 这个泛型的类型可以自己来定
return list;
}
泛型的上下限
代码语言:javascript复制 @Test
public void generic1(List<? extends Parent> list){
List<User> li=new ArrayList<>();
list = li;
}
上面这个案例中如果User没有继承Parent类那么list=li这里在进行赋值的时候就会报错
代码语言:javascript复制接下来讲List<T>
这个最大的问题是只能放置一种类型,如果随意转换类型的话,泛型就失去了类型安全的意义。如果需要放置多种受泛型约束的类型,jdk实现了<? extends T>与<? super T>两种语法
是get First 适用于消费集合元素为主的场景,是Put First 适用于,生产集合元素为主的场景 可以赋值给任何T及T子类的集合,上界为T可以赋值给任何T以及T的父类集合,下界为T