• 关于JAVA泛型中的通配符类型


      之前对JAVA一知半解时就拿起weiss的数据结构开始看,大部分数据结构实现都是采取通配符的思想,好处不言而喻。

        首先建立两个类employee和manager,继承关系如下。其次Pair类是一个简单的泛型类。

        

          通配符的作用就是在泛型设计程序中允许类型参数变化


        子类型限定

    Pair<? extends Employee>

          extends可以理解为是向下的 ↓ 

        即所有Employee的子类都是可以的,可以理解为Pair<Manager>是Pair<? extends Employee>的子类型

        

    1 /*
    2 打印雇员对的方法
    3 */
    4 public static void printBuddies(Pair<? extends Employee> p)
    5 {
    6     Employee first=p.getFirst();
    7     Employee second-p.getSecond();
    8     System.out.println(...)
    9 }

        上例的方法可以将Pair<Manager>传递过去


        通配符限定还有个超类型限定

    ? super Manager

        super关键字如同字面意思,是↑的,即所有Manager父类都是可以的。

        

     1 /*
     2 数组放入奖金最高和最低的经理
     3 */
     4 public static void minmaxBonus(Manager[] a,Pair<? super Manager> result)
     5 {
     6     if(a.length==0)
     7         return;
     8     Manager min=a[0];
     9     Manager max=a[0];
    10     for(int i=0;i<a.length;i++)
    11     {
    12         if(min.getBonus()>a[i].getBonus()) 
    13             min=a[i];
    14         if(min.getBonus()<a[i].getBonus()) 
    15             max=a[i];
    16     }
    17     result.setFirst(min);
    18     result.setSecond(max);
    19 }

      直观的讲,带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象读取


        

        下面定义一个类扩展了comparable接口

    1 class getMax implements Comparable<Integer>{
    2 
    3     @Override
    4     public int compareTo(Integer o) {
    5         // TODO Auto-generated method stub
    6         return 0;
    7     }
    8     
    9 }

        可以观察到Comparable接口本身就是一个泛型类型,实现后会重写compareTo方法。

         现在可以给出一个泛型max限定方法

        

    public static <T extends Comparable> T max(..)

         

     1 public class MyGenerics {
     2     public static void main(String[] args) {
     3         Integer[] nums=new Integer[]{10,8};
     4         System.out.println(max(nums));
     5     }
     6     public static <T extends Comparable> T max(T[] a){
     7         if(a[0].compareTo(a[1])>0)
     8             return a[0];
     9         else
    10             return a[1];
    11         
    12     }
    13 }
    14 
    15 //output:10
    但是compareTo方法下会标黄,提示
    Type safety: The method compareTo(Object) belongs to the raw type Comparable.
    References to generic type Comparable<T> should be parameterized
    大意就是类型安全什么的,因为comparable接口已经是泛型接口comparable<T>限定了比较的类型
    public static <T extends Comparable<T>> T max(..)
    //所以最好采用这种形式

      


      比较难理解的就是

    public static <T extends Comparable<? super T>> T max(...)

      与上文比较主要是有<T>与<? super T>的区别,文章的开头已经清楚 ? super T 意思是所有T的超类都是可以的。

      现在可以把T换成Manager类

    public static <Manager extends Comparable<? super Manager>>  Manager max(...)

      如果没有 ? super 的话,上面的方法只能对Manager类进行操作,但是有个超类型限定,Emoployee也可以使用这个方法。

  • 相关阅读:
    #JavaScript 闭包问题详解 #打倒心魔
    Typora + cnblog 图片自动上传 (超详细哦)
    #FUNCTION#CALL对象中的函数内作用域问题.md
    #windows #Github #HOST
    #######对象迭代器######
    #为什么不建议使用for...in 去遍历数组
    #前后端附件传输,去重的一种方式#解决方案
    #页面滚动刷新的实现原理 #下拉刷新#上拉刷新#drag to fresh
    自己动手实现一个阻塞队列
    APC注入
  • 原文地址:https://www.cnblogs.com/xpang0/p/7767337.html
Copyright © 2020-2023  润新知