zoukankan      html  css  js  c++  java
  • 关于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也可以使用这个方法。

  • 相关阅读:
    spark streaming 概述
    spark sql 的性能调优
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal (用中序和后序树遍历来建立二叉树)
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal (用先序和中序树遍历来建立二叉树)
    LeetCode 90. Subsets II (子集合之二)
    LeetCode 88. Merge Sorted Array(合并有序数组)
    LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)
    LeetCode 80. Remove Duplicates from Sorted Array II (从有序序列里移除重复项之二)
    LeetCode 79. Word Search(单词搜索)
    LeetCode 78. Subsets(子集合)
  • 原文地址:https://www.cnblogs.com/xpang0/p/7767337.html
Copyright © 2011-2022 走看看