List的三种形式的区别

2022-06-14 16:29:10 浏览数 (3)

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

1 人点赞