关于JAVA泛型中的通配符类型
之前对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泛型中的通配符类型的更多相关文章
- 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 下界通 ...
 - Java泛型中的通配符
		
Java泛型中的通配符可以直接定义泛型类型的参数.而不用把该函数定义成泛型函数. public class GenericsTest { public static void main(String[ ...
 - 【转】聊一聊-JAVA 泛型中的通配符 T,E,K,V,?
		
原文:https://juejin.im/post/5d5789d26fb9a06ad0056bd9 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型 ...
 - Java 泛型中的通配符
		
本文内容如下: 1. 什么是类型擦除 2.常用的 ?, T, E, K, V, N的含义 3.上界通配符 < ?extends E> 4.下界通配符 < ?super E> 5 ...
 - JAVA泛型中的有界类型(extends super)(转)
		
JDK1.5中引入了泛型(Generic)机制.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...
 - JAVA 泛型中的通配符 T,E,K,V,?
		
前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...
 - Java泛型中的通配符的使用
		
package com.srie.testjava; import java.util.ArrayList; import java.util.List; public class TestClass ...
 - Java泛型中的协变和逆变
		
Java泛型中的协变和逆变 一般我们看Java泛型好像是不支持协变或逆变的,比如前面提到的List<Object>和List<String>之间是不可变的.但当我们在Java泛 ...
 - Java泛型中extends和super的区别?
		
<? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...
 
随机推荐
- OracleBulkCopy 修正帮
			
using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Refle ...
 - Spring Boot☞ 使用velocity渲染web视图
			
效果图: 代码 <!DOCTYPE html><html><head lang="en"> <meta charset="UTF ...
 - linux 创建数据库
			
mysql -uroot -pxxxxxx 1. 修改服务器的字符集 打开/etc/mysql/my.cnf,在[mysqld]后添加character-set-server=utf8 2. 查看my ...
 - eclipse 市场
			
http://marketplace.eclipse.org/ 如何找工具官网? 举例:UMLet 进入官网以后,下载插件,然后离线安装.
 - Spark 0.9.1和Shark 0.9.1分布式安装指南
			
目录 目录 1 1. 约定 1 2. 安装Scala 1 2.1. 下载 2 2.2. 安装 2 2.3. 设置环境变量 2 3. 安装Spark 2 3.1. 部署 2 3.2. 下载 3 3.3. ...
 - 编写高质量代码改善C#程序的157个建议——建议134:有条件地使用前缀
			
建议134:有条件地使用前缀 在.NET的设计规范中,不建议使用前缀.但是,即便是微软自己依然广泛的使用这前缀. 最典型的前缀是m_,这种命名一方面是考虑到历史沿革中的习惯问题,另一方面也许我们确实有 ...
 - Alpha冲刺(五)
			
Information: 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Details: 组员1 柯奇豪 过去两天完成了哪些任务 基于ssm框架的前后端交互测试,结合微信小 ...
 - HBASE--MapReduce
			
1.查看 HBase 的 MapReduce 任务的执行 $ bin/hbase mapredcp 2.执行环境变量的导入 $ export HBASE_HOME= ~/hadoop_home/hba ...
 - FileInputStream和FileOutStream的使用——文件字节输入/输出流
			
最近又退回到java EE的学习,这篇博客就来讲解一下字节流中最重要的两个类FileInputStream和FileOutputStream的用法: FileInputStream:全称是文件字节输入 ...
 - 折腾了两天的跨站脚本提交问题,与IIS7有关
			
根据这里提供的方法,本地测试通过没有问题,但是部署到服务器上之后,只有GET请求可以跨站提交,POST请求继续报错,折腾了两天之后觉得,是不是IIS7的问题?果然,找到了这篇文章,照做之后解决.