打字猴:1.700447135e+09
1700447135
1700447136 //把一个变长参数转变为列表,并且长度可变
1700447137
1700447138 public static<T>List<T>asList(T……t){
1700447139
1700447140 List<T>list=new ArrayList<T>();
1700447141
1700447142 Collections.addAll(list, t);
1700447143
1700447144 return list;
1700447145
1700447146 }
1700447147
1700447148 }
1700447149
1700447150 这很简单,与Arrays.asList的调用方式相同,我们传入一个泛型对象,然后返回相应的List,代码如下:
1700447151
1700447152 public static void main(String[]args){
1700447153
1700447154 //正常用法
1700447155
1700447156 List<String>list1=ArrayUtils.asList(“A”,“B”);
1700447157
1700447158 //参数为空
1700447159
1700447160 List list2=ArrayUtils.asList();
1700447161
1700447162 //参数为数字和字符串的混合
1700447163
1700447164 List list3=ArrayUtils.asList(1,2,3.1);
1700447165
1700447166 }
1700447167
1700447168 这里有三个变量需要说明:
1700447169
1700447170 (1)变量list1
1700447171
1700447172 变量list1是一个常规用法,没有任何问题,泛型实际的参数类型是String,返回的结果也就是一个容纳String元素的List对象。
1700447173
1700447174 (2)变量list2
1700447175
1700447176 变量list2中容纳的是什么元素呢?我们无法从代码中推断出list2列表到底容纳的是什么元素(因为它传递的参数是空,编译器也不知道泛型的实际参数类型是什么),不过,编译器会很“聪明”地推断出最顶层类Object就是其泛型类型,也就是说list2的完整定义如下:
1700447177
1700447178 List<Object>list2=ArrayUtils.asList();
1700447179
1700447180 如此一来,编译时就不会给出“unchecked”警告了。现在新的问题出现了:如果期望list2是一个Integer类型的列表,而不是Object列表,因为后续的逻辑会把Integer类型加入到list2中,那该如何处理呢?
1700447181
1700447182 强制类型转化(把asList强制转换成List<Integer>)?行不通,虽然Java的泛型是编译擦除式的,但是List<Object>和List<Integer>没有继承关系,不能进行强制转换。
1700447183
1700447184 重新声明一个List<Integer>,然后读取List<Object>元素,一个一个地向下转型过去?麻烦,而且效率又低。
[ 上一页 ]  [ :1.700447135e+09 ]  [ 下一页 ]