举个例子,你有一个Object类型的List,List<Object> list = new ArrayList<>();
用Object类是为了能够让它能放各种类型的数据,而运行时你才知道数据是什么类型,假设是String类型的,又假设之前你有向其中添加一些数据
list.add("test");
list.add("abc");
这个时候你想把这个List转换为String类型的List,以方便后面的操作
于是天真的写了这种代码List<String> newList = (List<String>)list;
然后发现这种转换编译器是不允许的。
当然非要这么转换也不是不行,很自然的方法就是新创建一个String类型的List,然后遍历原来的List,把元素一个一个转为String类型然后存入新的List中。
这种方法在List元素很少的情况的还是可行的,但是如果元素很多,这种方法既浪费时间,又要白白创建一个新List浪费空间。
如果你对List每一个元素的类型很有自信,那么就可以适当“欺骗”一下Java让它不要多管闲事,我就爱转你管我。
@SuppressWarnings("unchecked")
public static <T> List<T> convert(List<?> list, Class<T> c) {
return (List<T>)list;
}
给一个例子
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
list.add("test");
list.add("abc");
List<String> strs = convert(list, String.class);
for (String str : strs) {
System.out.println(str);
}
}
----------------------------------------更新----------------------------------------
其实那个convert方法可以更简单,Class<T>这个参数是多余的,使用泛型T并不需要一个带泛型的参数。
下面的例子同样实现了我们需要的功能。
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
list.add("hahaha");
list.add("123");
List<String> newList = convert(list);
for (String str : newList) {
System.out.println(str);
}
}
@SuppressWarnings("unchecked")
public static <T> List<T> convert(List<?> list) {
return (List<T>)list;
}