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

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

    

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


    子类型限定

  1. 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>传递过去


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

  1. ? 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限定方法

    

  1. 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>限定了比较的类型
  1. public static <T extends Comparable<T>> T max(..)
    //所以最好采用这种形式

  


  比较难理解的就是

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

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

  现在可以把T换成Manager类

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

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

关于JAVA泛型中的通配符类型的更多相关文章

  1. Java泛型中的通配符T,E,K,V

    Java泛型中的通配符T,E,K,V 1.泛型的好处 2.泛型中的通配符 2.1 T,E,K,V,? 2.2 ?无界通配符 2.3 上界通配符 < ? extends E> 2.4 下界通 ...

  2. Java泛型中的通配符

    Java泛型中的通配符可以直接定义泛型类型的参数.而不用把该函数定义成泛型函数. public class GenericsTest { public static void main(String[ ...

  3. 【转】聊一聊-JAVA 泛型中的通配符 T,E,K,V,?

    原文:https://juejin.im/post/5d5789d26fb9a06ad0056bd9 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型 ...

  4. Java 泛型中的通配符

    本文内容如下: 1. 什么是类型擦除 2.常用的 ?, T, E, K, V, N的含义 3.上界通配符 < ?extends E> 4.下界通配符 < ?super E> 5 ...

  5. JAVA泛型中的有界类型(extends super)(转)

    JDK1.5中引入了泛型(Generic)机制.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...

  6. JAVA 泛型中的通配符 T,E,K,V,?

    前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...

  7. Java泛型中的通配符的使用

    package com.srie.testjava; import java.util.ArrayList; import java.util.List; public class TestClass ...

  8. Java泛型中的协变和逆变

    Java泛型中的协变和逆变 一般我们看Java泛型好像是不支持协变或逆变的,比如前面提到的List<Object>和List<String>之间是不可变的.但当我们在Java泛 ...

  9. Java泛型中extends和super的区别?

    <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...

随机推荐

  1. VS优化编译配置

    在使用VS2010编译C++程序的时候,每次修改工程中的某一个文件,点击“生成-仅用于项目-仅生成**”时,往往都是整个工程都需要重新编译一遍.由于这个工程代码量太大,每次编译完成都需要将近10分钟左 ...

  2. 使用python管理Cisco设备-乾颐堂

    今天发现一个老外使用python写的管理cisco设备的小框架tratto,可以用来批量执行命令. 下载后主要有3个文件: Systems.py 定义了一些不同设备的操作系统及其常见命令. Conne ...

  3. [SoapUI] DataSource, DataSourceLoop, DataSink

    Script assertion in login:

  4. APUE(7)---进程环境

    一.main函数 C程序总是从main函数开始执行.main函数的原型是: int main(int argv, char *argv[]); 当内核执行C程序时,在调用main前先调用一个特殊的启动 ...

  5. 基于Struts2开发快递收发系统 毕业设计 源码

    基于Struts2开发快递收发系统 开发环境:  Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat6+MySql数据库 运行效果图: 此源码经过详细测试 保证 ...

  6. Android 使用pk10系统架设RecyclerView实现轮播图

    一.需求 ViewPager有个天生的缺陷是View无法重用,此外pk10系统架设详情咨询[企娥166848365]ViewPager的滑动过程会频繁requestLayout,尽管可以通过addVi ...

  7. EF 查询视图返回重复数据的问题

    在特殊的情况下查询过滤视图 会出现重复的数据结果集(返回的多条数据结果一致). 原因是啥:主键 在数据库设计的理念中:每个表都应该的唯一的主键.但视图不同,EF中会自动按视图的最前几个非空型字段设置为 ...

  8. Decoding VOX Files in C# (Converting VOX Files to WAV Files)

    I wrote a C# class to decode VOX files into WAV files. It follows the Dialogic ADPCM specificationst ...

  9. Redis分布式锁方案

  10. pageadmin建站软如何修改和设置iis站点应用程序池

    很多用户第一次安装PageAdmin建站系统时候会出现这个错误,主要原因: 1.首选打开iis站点基本设置,可以看到当前站点对应的应用程序池,如下图: 可以看到当前站点用的程序池名为MyAppPool ...