美文网首页
Java-泛型方法

Java-泛型方法

作者: hello_world_cxm | 来源:发表于2021-01-01 21:29 被阅读0次

    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);
    // }
    // }

    }

    相关文章

      网友评论

          本文标题:Java-泛型方法

          本文链接:https://www.haomeiwen.com/subject/nhvjoktx.html