Java泛型解析(02):通配符限定
public class ArrayUtil {public static <T> T max(T[] array) {if (array == null || 0 == array.length) { return null ;}T max = array[0];for (int i = 1; i < array.length; i++) {if (max.compareTo(array[i]) < 0) {max = array[i];}}return max;}}
public class ArrayUtil {public static <T extends Comparable<T>> T max(T[] array) {if (array == null || 0 == array.length) { return null ;}T max = array[0];for (int i = 1; i < array.length; i++) {if (max.compareTo(array[i]) < 0) {max = array[i];}}return max;}}
<T extends Bounding Type>,表示T类型应该是绑定类型及其子类型(subType),T和绑定类型能够是类或者接口,使用extendskeyword由于它更接近于子类的概念,另外Java设计者并不打算为Java加入新的keyword如:sub
<T extends Runnable & Serializable>
<T extends Runnable & Serializable & ArrayList> // 错误<T extends Runnable & ArrayList & Serializable> // 错误<T extends ArrayList & LinkedList & Serializable> // 错误<T extends ArrayList & Runnable& Serializable> // 正确
<T super File & Runnable> // 错误
public static <T super Runnable> void test(T runner) {runner.run();}
不管从设计角度,还是从后期扩展的角度。都是说只是去的。
Couple<? extends Employee>
public static void printWife(Couple<Employee> couple) {Employee wife = couple.getWife();System. out.println(wife);}
所以要想让Manager也能结婚并打印其wife,须要更改我们的设计了:
public static void printWife(Couple<? extends Employee> couple) {Employee wife = couple.getWife();System. out .println(wife);}
public static <T extends Comparable<T>> T max(T[] array) {...}public static void printWife(Couple<? extends Employee> couple) {...}
而后者中不存在类型參数的定义,max方法參数的类型是预先定义好的Couple类型,使用者无法在使用的时候指定其它类型,但能够有限制地指定Couple中的泛型參数的类型,
extends Employee 自身不能单独使用,能够理解为仅仅能寄生在其它泛型类中,作为泛型类一个详细的类型參数,通经常使用于定义阶段,如以下:
public static ? extends Employee printWife() {...} // 错误public static void printWife(? extends Empoyee employee) {...} // 错误
Couple<? super Manager>
Couple<Manager> couple = new Couple<Manager>(new Manager(),new Manager());Couple<? extends Employee> couple2 = couple;Employee wife = couple2.getWife();// couple2.setWife(new Manager()); // 此处编译错误
?
extends Employee getWife() {...} void setWife(? extends Employee) {...}
所以通配符的子类限定适用于读取。
? super Manager getWife() {...}void setWife(? super Manager) {...}
"表示,而且也只能用于指定泛型类的类型參数中。如Couple<?>的形式,此时getWife和setWife方法如:
?
getWife() {...} void setWife(?) {...}
public static boolean isCoupleComplete(Couple<?
> couple) { return couple.getWife() != null && couple.getHusband() != null; }
public static <T> boolean isCoupleComplete(Couple<T> couple) {return couple.getWife() != null && couple.getHusband() != null ;}public static <T extends Employee> boolean isCoupleComplete(Couple<T> couple) {return couple.getWife() != null && couple.getHusband() != null ;}
这里考虑三种通配符的捕获
extends Employee> couple:getWife返回Employee
super Manager> couple:无法捕获,getWife返回Object
> couple:无法捕获,getWife返回Object
public static void print(Couple<?> couple) {printHelp(couple);}public static <T> void printHelp(Couple<T> couple) {T husband = couple.getHusband();T wife = couple.getWife();couple.setHusband(wife);couple.setWife(husband);System. out.println(husband);System. out.println(wife);}
如Couple<?
>、Couple<? extends Employee> 、Couple<? super Manager>
=====【感谢亲阅读寻常心的文章,亲若认为此文有帮助,顶一顶呗。亲的支持将给我前进的动力】=====
Java泛型解析(02):通配符限定相关推荐
- 一文读懂Java泛型中的通配符 ?
之前不太明白泛型中通配符"?"的含义,直到我在网上发现了Jakob Jenkov的一篇文章,觉得很不错,所以翻译过来,大家也可以点击文末左下角的阅读原文看英文版的原文. 下面是我的 ...
- 聊一聊Java 泛型中的通配符 T,E,K,V,?
点击上方"方志朋",选择"设为星标" 回复"1024"获取独家整理的学习资料 作者:glmapper juejin.im/post/5d57 ...
- 聊一聊-JAVA 泛型中的通配符 T,E,K,V,?
前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...
- Java泛型三:通配符详解extends super
在java泛型中,? 表示通配符,代表未知类型,< ? extends Object>表示上边界限定通配符,< ? super Object>表示下边界限定通配符. 通配符 与 ...
- JAVA 泛型中的通配符 T,E,K,V,?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群",加入新技术 来源:8rr.co/2Xqx 前言 Java 泛型(generic ...
- java泛型概念与通配符含义初探
一般类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类.如果要编写可以应用与多重类型的代码,这种刻板的限制对代码的束缚就会很大. 泛型的概念: 泛型实现了参数化类型的概念,使代码可以应用于 ...
- 原神一面:Java 泛型中的通配符 T,E,K,V,?,你确定都了解吗?
点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Sometimes, the same thing, we can ...
- Java泛型专题之2、聊一聊-JAVA 泛型中的通配符 T,E,K,V,?
目录 1. 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说 ...
- java泛型解析(转)
对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下.本文参考java 泛型详解.Java中的泛型方法. java泛型详解 1. 概述 泛型在j ...
最新文章
- 深度学习模型参数量/计算量和推理速度计算
- select标签动态获取数据时如何控制下拉框长度
- Linux下rpm包x86、i386、i486、i586、i686和x86_64 后缀含义
- C++ stl 通用算法和成员函数使用
- 《NLTK基础教程——用NLTK和Python库构建机器学习应用》——2.3 语句分离器
- Effective Objective-C 2.0 初读小结
- Androd安全——反编译技术完全解析
- win10 mysql my.cnf_MySQL配置文件无法修改的解决方法(Win10)
- java读写注册表的两种方式,Preferences与jRegistry
- matlab 正则化表达式_MATLAB 正则表达式(一)(转)
- poj - 2488 A Knight's Journey
- Android无线安全测试工具-WiFinSpect
- poj 无向图最小环问题 详解,模板
- 前端项目实战5:聊天对话框
- 计算机常见故障英语,常见电脑黑屏(有英文字母)的解决办法
- Linux——常用工具
- Rosalind第16题——ros_bio16_MPRT
- HTML中字体相关单位
- 郑州大学计算机专业国际学院,郑州大学国际学院怎么样?郑州大学国际学院好吗?(历年分数、专业设置、校园环境、教学实力、名人校友) - 职友集...
- Enterprise Architect安装使用
热门文章
- python财务报表分析-用Python爬取东方财富网上市公司财务报表
- python爬虫框架排行榜-公认8个效率最高的爬虫框架
- python 调用linux命令-Python Linux系统管理之Python中执行外部命令
- python学习书籍推荐-推荐python机器学习实践的书籍?
- python使用os和shutil模块进行文件创建,删除,移动,复制,重命名
- 遗传算法介绍和遗传算法的python实现
- LeetCode Reconstruct Itinerary(欧拉回路)
- 分享九款构建响应式网站的最佳PHP框架
- TThread深入分析
- Android前沿技术