泛型使用笔记
强制声明泛型的实际类型
/**
* 把一个变长参数转换为列表,并且长度可变
* @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等方法,
那是因为它的删除动作与泛型类型无关。