lcpsky

导航

泛型使用笔记

强制声明泛型的实际类型

/**
 * 把一个变长参数转换为列表,并且长度可变
 * @author: Administrator
 * @date: 2021/01/30 20:15
 * @description:
 */
public class Seg95 {
    public static void main(String[] args) {
        //正常用法
        List<String> list1 = ArrayUtil.asList("A","B");
        //java8中Stream替代写法
        List<String> list4 = Stream.of("A", "B").collect(Collectors.toList());
        //参数为空
        List list2 = ArrayUtil.asList();
        //参数未数字和字符串的混合
        List list3 = ArrayUtil.asList(1,2,3.1);
        List list5 = Arrays.asList(1,2,3.1);

        System.out.println(list1);
        System.out.println(list2);
        System.out.println(list3);
        System.out.println(list4);
        System.out.println(list5);
    }
}
class ArrayUtil{
    public static <T> List<T> asList(T... t){
        List<T> list = new ArrayList<>();
        Collections.addAll(list,t);
        return list;
    }
}

不同的场景使用不同的泛型通配符

泛型结构只参与读操作则限定上界(extends关键字)
泛型结构只参与写操作则限定下界(使用super关键字)
泛型结构即用作读操作有用作写操作,使用确定的泛型类型即可如List

/**
 * 泛型结构只参与读操作则限定上界(extends关键字)
 * 泛型结构只参与写操作则限定下界(使用super关键字)
 * 泛型结构即用作读操作有用作写操作,使用确定的泛型类型即可如List<E>
 * @author: Administrator
 * @date: 2021/01/30 20:15
 * @description:
 */
public class Seg96 {
    public static void main(String[] args) {

    }
    public static <E> void read(List<? extends E> list){
        for (E e : list) {
            //业务逻辑处理
        }
    }
    public static void write(List<? super Number> list){
        list.add(123);
        list.add(3.14);
    }
}

list中泛型顺序为T、?、Object

List,List<?>,List这三者都可以容纳所有的对象,但是使用的顺序应该是首选
List,次之List<?>,最后List
List是确定的某一个类型,可以进行读写操作,支持add,remove
List<?>是只读类型,不能进行增加、修改操作,但是可以进行删除元素,比如执行remove,clear等方法,
那是因为它的删除动作与泛型类型无关。

posted on 2021-07-22 20:38  lcpsky  阅读(26)  评论(0编辑  收藏  举报