二、泛型类和接口 之 泛型类

泛型类

泛型类的定义语法

class 类名称<泛型标识,泛型标识,...>{

  private 泛型标识 变量名; ...

}

 

 

常见的泛型标识:T、E、K、V

(1)使用语法

类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>();

(2)Java1.7以后,后面的<>中的具体的数据类型可以省略不写

类名<具体的数据类型> 对象名 = new 类名<>(); 菱形语法

泛型类注意事项:

  • 泛型类,如果没有指定具体的数据类型,此时,操作类型是Object

  • 泛型的类型参数只能是类类型,不能是基本数据类型

  • 泛型类型在逻辑上可以看成是多个不同的类型,但实际上都是相同类型

小案例:

 1 package com.genericity;
 2 
 3 import com.sun.corba.se.impl.orbutil.ObjectStreamClassUtil_1_3;
 4 
 5 /**
 6  * 泛型类
 7  */
 8 public class MainClassTest {
 9     public static void main(String[] args) {
10         //泛型类在创建对象的时候,来指定的具体数据类型
11         Generic<String> stringGeneric = new Generic<>("abc");
12         String key1 = stringGeneric.getKey();
13         System.out.println(key1);
14 
15         System.out.println("===============================================");
16 
17         Generic<Integer> integerGeneric = new Generic<>(100);
18         String key2 = stringGeneric.getKey();
19         System.out.println(key2);
20 
21         //泛型类,不支持基本数据类型
22 //        Generic<int> integerGeneric = new Generic<>(100);
23 
24         System.out.println("===============================================");
25         //泛型类在创建对象的时候,没有指定类型,将按照Object类型来操作
26         Generic objGeneric = new Generic<>("abc");
27         Object key = objGeneric.getKey();
28         System.out.println(key);
29 
30         System.out.println("===============================================");
31         System.out.println(stringGeneric.getClass());
32         System.out.println(integerGeneric.getClass());
33         System.out.println(integerGeneric.getClass()==stringGeneric.getClass());
34     }
35 }
View Code
 1 运行结果:
 2 abc
 3 ===============================================
 4 abc
 5 ===============================================
 6 abc
 7 ===============================================
 8 class com.genericity.Generic
 9 class com.genericity.Generic
10 true
View Code

抽奖小案例:

 1 package com.genericity;
 2 
 3 import lombok.val;
 4 
 5 public class ProductGetterTest {
 6     public static void main(String[] args) {
 7         //创建抽奖对象,指定数据类型
 8         ProductGetter<String> stringProductGetter = new ProductGetter<>();
 9         String[] stringProducts={"苹果手机","华为手机","扫地机器人","咖啡机","杠铃","机械键盘"};
10         for (int i = 0; i < stringProducts.length; i++) {
11             stringProductGetter.addProduct(stringProducts[i]);
12         }
13         //开始进行抽奖
14         String stringproduct = stringProductGetter.getProduct();
15         System.out.println("恭喜您抽中了:"+stringproduct);
16 
17         System.out.println("=======================================================");
18         //假设我们的奖品是现金
19         ProductGetter<Integer> integerProductGetter = new ProductGetter<>();
20         Integer[] integerProducts={100,200,300,400,500,600};
21         for (int i = 0; i < integerProducts.length; i++) {
22             integerProductGetter.addProduct(integerProducts[i]);
23         }
24         //开始进行抽奖
25         int integerproduct = integerProductGetter.getProduct();
26         System.out.println("恭喜您抽中了:"+integerproduct);
27     }
28 }
View Code
1 运行结果:
2 恭喜您抽中了:扫地机器人
3 =======================================================
4 恭喜您抽中了:600
View Code

从泛型类派生子类

子类也是泛型类,子类和父类的泛型类型要保持一致

class ChildGeneric<T> extends Generic<T>

子类不是泛型类,父类要明确泛型类的数据类型

class ChildGeneric extends Generic<Stirng>

小案例:

 1 package com.genericity;
 2 
 3 /**
 4  * 创建父类 泛型类
 5  * @param <E>
 6  */
 7 public class Parent<E> {
 8     private E value;
 9 
10     public E getValue() {
11         return value;
12     }
13 
14     public void setValue(E value) {
15         this.value = value;
16     }
17 }
View Code
 1 package com.genericity;
 2 
 3 /**
 4  * 泛型类派生子类,子类也是泛型类,那么子类的泛型标识要和父类的一致
 5  * 当然这里子类是可以扩展泛型标识的 public class ChildFirst<T,K,V> extends Parent<T> {
 6  * @param <T>
 7  */
 8 public class ChildFirst<T> extends Parent<T> {
 9     @Override
10     public T getValue() {
11         return super.getValue();
12     }
13 }
View Code
 1 package com.genericity;
 2 
 3 
 4 /**
 5  * 泛型类派生子类,如果子类不是泛型类,那么父类要明确数据类型
 6  */
 7 public class ChildSecond extends Parent<Integer> {
 8     /**
 9      * 注意:如果这里 是 public class ChildSecond extends Parent {
10      * 那么子类重写父类的方法的时候,默认就是Object类型的
11      */
12 //    @Override
13 //    public Object getValue() {
14 //        return super.getValue();
15 //    }
16     @Override
17     public Integer getValue() {
18         return super.getValue();
19     }
20 
21     @Override
22     public void setValue(Integer value) {
23         super.setValue(value);
24     }
25 }
View Code
 1 package com.genericity;
 2 
 3 public class MainTest {
 4     public static void main(String[] args) {
 5         Parent<String> stringChildFirst = new ChildFirst<>();
 6         stringChildFirst.setValue("abc");
 7         String value = stringChildFirst.getValue();
 8         System.out.println(value);
 9 
10         System.out.println("=================================================");
11 
12         Parent<Integer> integeChildFirst = new ChildSecond();//注意:这个时候子类就是具体类型的了
13         integeChildFirst.setValue(200);
14         Integer value1 = integeChildFirst.getValue();
15         System.out.println(value1);
16     }
17 }
View Code

 

posted on 2021-12-08 13:32  ~码铃薯~  阅读(78)  评论(0编辑  收藏  举报

导航