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

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

    

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


    子类型限定

Pair<? extends Employee>

      extends可以理解为是向下的 ↓

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

    

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

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


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

? super Manager

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

    

 /*
数组放入奖金最高和最低的经理
*/
public static void minmaxBonus(Manager[] a,Pair<? super Manager> result)
{
if(a.length==0)
return;
Manager min=a[0];
Manager max=a[0];
for(int i=0;i<a.length;i++)
{
if(min.getBonus()>a[i].getBonus())
min=a[i];
if(min.getBonus()<a[i].getBonus())
max=a[i];
}
result.setFirst(min);
result.setSecond(max);
}

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


  

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

 class getMax implements Comparable<Integer>{

     @Override
public int compareTo(Integer o) {
// TODO Auto-generated method stub
return 0;
} }

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

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

    

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

   

 public class MyGenerics {
public static void main(String[] args) {
Integer[] nums=new Integer[]{10,8};
System.out.println(max(nums));
}
public static <T extends Comparable> T max(T[] a){
if(a[0].compareTo(a[1])>0)
return a[0];
else
return a[1]; }
} //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也可以使用这个方法。

关于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. es学习-重建索引

    url:POST http://127.0.0.1:9200/_reindex 参数: {"source":{"index":"myes"} ...

  2. (转)unordered_map与map的对比(C++11新特性)

    unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value.不同的是unordered_map不会根据key的大小进行排序, 存储时是根据key的ha ...

  3. SQLServer学习-- SQLServer

    SQL Server 是Microsoft 公司推出的关系型数据库管理系统.具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行M ...

  4. a 标签 name 属性 页面定位 (一)

    a(§b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...

  5. Makefile模板

    CC = gcc LD = gcc CFLAGS = -Wall -c LDFLAGS = SRC_DIRS = src test INC_DIRS = inc OBJ_DIR = obj OUT_D ...

  6. 设计模式9---装饰模式(Decorator Pattern)

    装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上一些责任.换言之,客户端 ...

  7. C和C++中的异常处理

    1.简介 许多的编程新手对异常处理视而不见,程序里很少考虑异常情况.一部分人甚至根本就不考虑,以为程序总是能以正确的途径运行.譬如我们有的程序设计者调用fopen打开一个文件后,立马就开始进行读写操作 ...

  8. Linux基本命令集合

    #Linux查看版本当前操作系统内核信息 uname -a #Linux查看当前操作系统版本信息 cat /proc/version #Linux查看版本当前操作系统发行版信息 cat /etc/is ...

  9. zookeeper 开机启动

    第一种:直接修改/etc/rc.d/rc.local文件 在/etc/rc.d/rc.local文件中需要输入两行,其中export JAVA_HOME=/usr/java/jdk1.8.0_112是 ...

  10. 谈谈iOS开发如何写个人中心这类页面--静态tableView页面的编写

    本文来自 网易云社区 . 一.本文讲的是什么问题? 在开发 iOS 应用时,基本都会遇到个人中心.设置.详情信息等页面,这里截取了某应用的详情编辑页面和个人中心页面,如下: 我们以页面结构的角度考虑这 ...