package Hello1;
import java.util.List;
import java.util.ArrayList;
public class Test8 {
//需求假如我要将一个数组类型的所有元素复制到集合中,怎么写
//更进一步,如果我想要对T的类型做出限制,怎么限制
public static void main(String[] args) {
Test8 t8 = new Test8();
List<String> l1 = new ArrayList<>(); //泛型两边都要保持一致 右边可以不写
List<Number> l2 = new ArrayList<>();
List<Integer> l3 = new ArrayList<>();
List<Double> l4 = new ArrayList<>();
List<Comparable> l5 = new ArrayList<>();
copy(new String[]{}, l1); //定义字符串类型的数组 然后赋值给os
copy(new Number[]{}, l2); //定义字符串类型的数组 然后赋值给os
copy(new Integer[]{}, l3); //定义字符串类型的数组 然后赋值给os
copy(new Double[]{}, l4); //定义字符串类型的数组 然后赋值给os
copy(new Comparable[]{}, l5); //定义字符串类型的数组 然后赋值给os
copy(new Double[]{}, l4); //定义字符串类型的数组 然后赋值给os
//这时候list类型是String,但是Object[] os则是Double类型,但是此时String对象是不能被放进Double数组的
//所以如下面那种方法是编译错误的
}
static <T extends Number & Comparable> void copy(T[] os,List<T> list) {
//static <T super Number> void copy(T[] os,List<T> list) { //编译错误 ,super只能用在泛型通配符上,不能用在泛型方法上
// static <T extends Number> void copy(T[] os,List<T> list) { //Number和子类都能通过
//用字母T要约束数组os和集合list的类型 T可以是其他的字母,但是习惯用大写T
//假如T是String类型,那么其余所有的T都是String类型,这就解决了基本需求
for(T o: os) { //遍历
list.add(o);
}
}
// static <T> void copy(T[] os,List<T> list) {
// //用字母T要约束数组os和集合list的类型 T可以是其他的字母,但是习惯用大写T
// //假如T是String类型,那么其余所有的T都是String类型,这就解决了基本需求
// for(T o: os) { //遍历
// list.add(o);
// }
// }
// static void copy(Object[] os,List<?> list) { //Object[] 表示Object类型的数组
// //问题:如果用通配符通配所有类型的集合,add方法明显是编译出错的
// //理由:编译器看来list是有泛型的,所以不确定os数组,是否都能符合泛型要求 所以报错
// //思路:所以得让数组类型与泛型类型是一致的
// for(Object o: os) { //遍历
// list.add(o);
// }
// }
}
网友评论