泛型学习

 

泛型概念:<> 泛化类型

泛型作用:安全省心

具体使用:

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






原文地址:https://www.cnblogs.com/dooor/p/5285489.html