• 泛型学习


     

    泛型概念:<> 泛化类型

    泛型作用:安全省心

    具体使用:

    1、自定义泛型

    1)泛型类:类<字母> T E K V

    *只能用在成员变量上,只能使用引用类型

    2)泛型接口:接口<字母,…>

    *只能用在抽象方法上

    3)泛型方法:<字母,…>

    • 泛型不能定义在静态属性上(静态方法可以)
    • <T extends List> :规范类型只能是List子类

     

    2、泛型继承、实现

    a父类为泛型类,子类继承时:

    1)父类 | 擦除 | 指定类型,子类按需编写

    2)父类存在泛型,子类必须>=

    3)属性类型:根据所在位置而定

    • 父类中,随父类而定
    • 子类中,随子类而定

    4)重写方法类型:随父类而定

    b 接口为泛型接口

    与继承同理,重写方法随接口而定

    1

     1 /**
     2  * 泛型父类
     3  * 1、保留父类泛型--->泛型子类
     4  * 2、不保留         ---->子类按需实现
     5  * 属性及方法类型 随位置而定
     6  * 子类重写方法的类型随父类
     7  * 子类中使用父类的属性随父类而定
     8  * @author qjc
     9  *
    10  * 2016-3-8
    11  */
    12 public abstract class FanXinExtends<T1,T2> {
    13     T1 age;
    14     public abstract void test(T2 name);
    15 }
    16 //保留 ---泛型子类(也可以多个泛型)
    17 //1)全部保留
    18 class C1<T1,T2> extends FanXinExtends<T1, T2>{
    19     @Override
    20     public void test(T2 name) {  //只能是T2 
    21 //        this.age ---Integer
    22     }
    23 }
    24 //2)部分保留
    25 class C2<T2> extends FanXinExtends<Integer, T2>{
    26     @Override
    27     public void test(T2 name) {     //只能是T2 
    28 //        this.age ---Integer
    29     }
    30 }
    31 //不保留 ---按需实现(也可以使泛型)
    32 //1)具体类型
    33 class C3 extends FanXinExtends<Integer, String>{
    34     @Override
    35     public void test(String name) {
    36 //        this.age ---Integer
    37     }
    38 }
    39 //2)没有类型 擦除 Object
    40 class C4 extends FanXinExtends{
    41     @Override
    42     public void test(Object name) {
    43 //        this.age ---Object
    44     }
    45 }

    3、泛型擦除

    2:

    /**
     * 泛型的擦除:使用 | 实现 | 继承 没有指定类型
     * 类似于Object 不等同于 Object
     * @author qjc
     *
     * 2016-3-8
     */
    public class TestStudent {
        public static void test(Student<Integer> stu){}
        public static void main(String[] args) {
            //擦除 -->没有指定泛型具体类型
            Student stu = new Student<>();
            stu.setName(25);    // int-->Integer-->Object
            Object obj = stu.getName();
            stu.setName("aa"); 
            test(stu); //编译不会类型检查
            Student<Object> stu2 = new Student<Object>();
    //        test(stu2); --编译不通过
        }
    }
    class Student<T> {
        private T name;
        public T getName() {
            return name;
        }
        public void setName(T name) {
            this.name = name;
        }
    }

    4、?通配符 -->类型不定,声明变量上

    1TKVE等泛型字母有类型,类型参数富裕具体的值

    2)?未知类型类型参数赋予不确定值,任意类型

    3)只能用在声明类型,方法参数三,不能用在定义泛型类上

    3

    /**
     * ? -->通配符,类型不确定,用于声明变量|形参上
     * 不能用在
     * 1、创建对象
     * 2、创建泛型类 泛型方法 泛型接口上
     * @author qjc
     *
     * 2016-3-8
     */
    public class WildcardsTest {
        public static void main(String[] args) {
            //声明
            List<?> list =new ArrayList<Integer>();
            list =new ArrayList<String>();
            list =new ArrayList<Object>();        
            test(list);
            //编译错误 不能创建对象
            //list =new ArrayList<?>();
        }
        public static void test(List<?> list){}
        /*
        //不能用在泛型方法上
        public static <?> void test2(List<?> list){}
        */
        class Test<T>{}
        /*
         //不能用在创建泛型类
        class Test2<?>{}
        */
    }

    5、上限 extends :指定的类型必须是继承某个类,或者实现某个接口(不是implements)即

    extends Fruit

    extends List

    extends <= 不能添加信息

    4

     1 /**
     2  *  继承链
     3  *   Object
     4  *     | 
     5  *   Fruit
     6  *    /  
     7  * Apple Pear
     8  *   |
     9  *  FujiApple
    10  * @author bj
    11  *
    12  */
    13 public class Fruit {
    14  
    15 }
    16 class Apple extends Fruit{}
    17 class Pear extends Fruit{}
    18 class FujiApple extends Apple{}
    19  
    20  
    21 /**
    22  * extends : 泛型的上限  <= 即子类或自身
    23  * 1、一般用于 限制操作
    24  * 2、不能使用在 添加数据上面,一般都是读取操作
    25  * 3、规则
    26  *  List<Fruit> -->List<? extends Fruit>
    27  *  List<Apple> -->List<? extends Fruit>
    28  *  List<? extends Apple> -->List<? extends Fruit>
    29  *  不能存放
    30  *  List<?>
    31  *  List<? extends Object>
    32  * @author qjc
    33  *
    34  * 2016-3-8
    35  */
    36 public class ExtendsTest {
    37     public static void main(String[] args) {
    38         //extends 为上限
    39         Test<Fruit> t1 =new Test<Fruit>();
    40         Test<Apple> t2 =new Test<Apple>();
    41         Test<Pear> t3 =new Test<Pear>();
    42  
    43         //规则 
    44         List<? extends Fruit> list1 =new ArrayList<Fruit>();
    45         test(list1);
    46         List<Fruit> list2 =new ArrayList<Fruit>();
    47         test(list2);
    48         List<Apple> list3 =new ArrayList<Apple>();
    49         test(list3);
    50         // ? extends Apple 
    51         List<? extends Apple> list4 =new ArrayList<FujiApple>();
    52         test(list4);
    53         //? -->为什么错误 ,因为 ? 等同于 ? extends Object
    54         List<?> list5=new ArrayList<Object>();
    55         List<? extends Object> list6=new ArrayList<Object>();
    56         //test(list6);
    57         List<FujiApple> app =new ArrayList<FujiApple>();        
    58         test(app);
    59     }
    60     //? extends Fruit
    61     public static void test(List<? extends Fruit> list){
    62         /*
    63         //不能用于添加数据
    64         list.add(new Apple());
    65         list.add(new FujiApple());
    66         list.add(new Pear());
    67         list.add(new Fruit());
    68         */
    69         list.add(null);
    70     }
    71     //泛型类
    72     static class Test<T extends Fruit>{
    73     }
    74 }
    75 
    76 6、下限 super : 指定的类型不能小于操作的类,即
    77 T supperApper
    78 ? supper Apper
    79 supper >= 不能添加父对象

    5

     1 /**
     2  * super : 泛型的下限  >= 即父类或自身
     3  * 1、一般用于 下限操作
     4  * 2、能够添加数据上面,不能添加父对象
     5  * 3、规则
     6  *  List<Fruit> -->List<? super Apple>
     7  *  List<Apple> -->List<? super Apple>
     8  *  List<? super Fruit> -->List<?super Apple>
     9  *  不能存放
    10  *  List<? super FujiApple> -->List<?super Apple>
    11  * @author qjc
    12  *
    13  * 2016-3-8
    14  */
    15 public class SuperTest {
    16  
    17     public static void main(String[] args) {
    18         // >= 即父类或自身
    19         List<Apple> list1 =new ArrayList<Apple>();
    20         test(list1);
    21         List<Fruit> list2 =new ArrayList<Fruit>();
    22         test(list2);
    23         List<Object> list3 =new ArrayList<Object>();
    24         test(list3);
    25         //规则
    26         List<? super Apple> list4 =new ArrayList<Apple>();
    27         test(list4);
    28         List<? super Fruit> list5 =new ArrayList<Object>();
    29         test(list5);
    30         List<? super FujiApple> list6 =new ArrayList<Object>();
    31         //test(list6); 编译报错
    32         List<?> list7 =new ArrayList<Object>();
    33         //test(list7); 编译报错
    34  
    35     }
    36     public static void test(List<? super Apple> list){
    37         //不能添加 父类对象
    38         list.add(new Apple());
    39         list.add(new FujiApple());
    40         //list.add(new Fruit());
    41     }
    42 }

    7、泛型的嵌套--由外到内获取即可。如:HashMap的遍历

    8、泛型没有多态也没有泛型数组

    6

    /**
     * 1、泛型没有多态
     * 2、泛型没有数组
     * @author qjc
     *
     * 2016-3-8
     */
    public class Others {
        public static void main(String[] args) {
            //多态
            Fruit f =new Apple();
            // 泛型没有多态
            //List<Fruit> list =new ArrayList<Apple>();
            List<? extends Fruit> list =new ArrayList<Apple>();
            //泛型没有数组
            //Fruit<String>[] arr =new Fruit<String>[10];
            //jdk1.7泛型简化
            List<Fruit> list2 =new ArrayList<>();
        }
    }






  • 相关阅读:
    11->centos6 安装oracle
    centos7安装rlwrap
    ajax
    java获取时间戳
    idea主要设置大纲图
    ppycharm设置解释器版本号码
    JTA 深度历险
    学会数据库读写分离、分表分库——用Mycat,这一篇就够了!
    分库分表的几种常见玩法及如何解决跨库查询等问题
    深入浅出SOA
  • 原文地址:https://www.cnblogs.com/dooor/p/5285489.html
Copyright © 2020-2023  润新知