关于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)"的概念. ...
随机推荐
- ubuntu14.04安装chromium以及flash插件
之前找了好几个方法都不还用,今天突然发现,还挺简单的.命令如下: sudo apt-get updatesudo apt-get install chromium-browser#sudo add-a ...
- (转)C#中的 Interfaces (For 初学者们)
http://blog.sina.com.cn/s/blog_574c993d0100d59n.html
- Hive入门学习随笔(二)
====使用Load语句执行数据的导入 --将操作系统上的文件student01.txt数据导入到t2表中 load data local inpath '/root/data/student01.t ...
- SQL2000中创建作业(定时查询,更新)(转)
出处:http://blog.csdn.net/xys_777/article/details/5683413 SQL2000中创建作业(定时查询,更新)企业管理器 --管理 --SQL Server ...
- 【转载】Jedis对管道、事务以及Watch的操作详细解析
转载地址:http://blog.csdn.net/liyantianmin/article/details/51613772 1.Pipeline 利用pipeline的方式从client打包多条命 ...
- 命令行执行 mvn package 和常见mvn命令
cmd 打开命令提示符, 然后打开代码所在目录,例如 d: cd d:/code 执行 mvn package Maven常用命令: 1. 创建Maven的普通java项目: mvn arc ...
- ssh关于含有外键的传值中无法识别正确的action的原因和解决办法
在含有外键的表中,要保存一个值到这个外键时:逻辑思路:需要先将jsp页面的值传到相应的action中,在这个action中需要引入这个外键的实体层和DAO层(DAO层只需set方法),在执行函数中对于 ...
- 团体程序设计天梯赛L1-022 奇偶分家 2017-03-22 17:48 81人阅读 评论(0) 收藏
L1-022. 奇偶分家 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定N个正整数,请统计奇数和偶数各有多少个? 输入格式 ...
- laravel中使用mgirations创建和迁移数据库
使用php artisan make:migration create_links_table命令 编辑2016_04_11_095342_create_links_table public func ...
- XE7 & FMX 那些年我们一起上过的控件:StringGrid 之(1) 自定义标题样式
FMX下的Grid类控件似乎不太尽如人意,可能是和官方的资料没有跟得上它的发行版本有关系. 以下讨论StringGrid的列表头及对齐方式. 先上个效果图: FMX的列表头估计很多人都是用盒子上流传甚 ...