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


    泛型类

    泛型类的定义语法

    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
  • 相关阅读:
    回调函数
    zoj 2104
    zoj 1760
    ppt 图的基本算法 dfs
    zoj 2110 Tempter of the Bone
    优先队列 priority_queue 55 nyist
    STL的队列和栈简单使用
    poj 2246 递归 zoj 1094
    nyist 8 set的应用
    bailian 2694
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/15661009.html
Copyright © 2020-2023  润新知