泛型典型的使用场景是集合。考虑到大多数情况下集合是同质的(同一类型),通过声明参数类型,可免去类型转换的麻烦。本文将讨论本人阅读Spring Security源码时遇到的一个关于泛型递归模式的问题。

声明方法返回子类型
在Spring Security的源码里有一个ProviderManagerBuilder接口,声明如下
public interface ProviderManagerBuilder<B extends ProviderManagerBuilder<B>> extends SecurityBuilder<AuthenticationManager> {
B authenticationProvider(AuthenticationProvider authenticationProvider);
}
其实现类AuthenticationManagerBuilder
public class AuthenticationManagerBuilder extends AbstractConfiguredSecurityBuilder<AuthenticationManager, AuthenticationManagerBuilder> implements ProviderManagerBuilder<AuthenticationManagerBuilder> {
//...
public AuthenticationManagerBuilder authenticationProvider(
AuthenticationProvider authenticationProvider) {
this.authenticationProviders.add(authenticationProvider);
return this;
}
//...
}
上面有很多干扰项,我们来简化一下
接口A定义如下
public interface A<T extends A<T>> {
T add();
}
说明:A接口只有一个add方法,返回泛型T。T的声明有些饶<T extends A<T>>。
A接口的实现类B
public class B implements A<B> {
@Override
public B add() {
return null;
}
}
注意,此处类B里的add方法返回类型B。也就是说,接口A里声明的方法时并不知道子类型B的存在,通过继承和泛型,可以放返回值动态的适配子类型,这一切都要归功于<T extends A<T>>
泛型递归模式(Recurring Generic Pattern)
public interface A
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
//...
}
java所有的枚举类型都隐式的继承java.lang.Enum,不允许通过现实的继承声明枚举类型,甚至集成java.lang.Enum也是编译器所不允许的。
假设有一个枚举类StatusCode,其等价的声明如下
public class StatusCode extends Enum<StatusCode>
现在我们来验证一下泛型约束,
1. 因为Enum<StatusCode>,所以E=StatusCode;
2. 根据<E extend Enum<E>> 和 E=StatusCode 可得,<StatusCode extend Enum<StatusCode>>;
3. 由于public class StatusCode extends Enum<StatusCode>第二步的结论显然成立。
为什么Enum的声明这么绕?直接Enum不行么?
因为Enum<E>实现了Comparable< E>接口,该接口有一个compareTo方法
public int compareTo(E o) {}
<E extend Enum> 强制约束了进行`compareTo`的调用对象类型和参数类型都严格一致,不会出现子类和超类或者兄弟类之间的比较。
泛型递归模式与继承
泛型递归模式interface A<T extend A<T>>用于约束参数类型T,要求其为类型A的子类。
考虑到继承和实现B implements A< B>,参数类型和实体类型是一致的。这样类A中方法签名里涉及到参数类型T的地方,在实现类里会为实现类本身,这让类型系统更加的严谨。
以上这篇浅谈Java泛型让声明方法返回子类型的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# java
# 返回类型
# 泛型
# java类成员中的访问级别浅析
# Java类成员访问权限控制知识总结
# 简单了解Java类成员初始化顺序
# Java 枚举类和自定义枚举类和enum声明及实现接口的操作
# Java类和成员变量声明类详解
# 递归
# 子类
# 有一个
# 给大家
# 考虑到
# 都要
# 有很多
# 这一切
# 希望能
# 只有一个
# 这篇
# 涉及到
# 会为
# 浅谈
# 这让
# 可得
# 第二步
# 小编
# 大家多多
# 其为
相关文章:
SQL查询语句优化的实用方法总结
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
网站好制作吗知乎,网站开发好学吗?有什么技巧?
公司网站设计制作厂家,怎么创建自己的一个网站?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
婚礼视频制作网站,学习*后期制作的网站有哪些?
建站之星如何实现PC+手机+微信网站五合一建站?
如何在宝塔面板中创建新站点?
如何快速重置建站主机并恢复默认配置?
如何基于云服务器快速搭建个人网站?
IOS倒计时设置UIButton标题title的抖动问题
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
建站主机选购指南与交易推荐:核心配置解析
建站之星如何实现五合一智能建站与营销推广?
如何通过云梦建站系统实现SEO快速优化?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
宝塔面板创建网站无法访问?如何快速排查修复?
大连网站设计制作招聘信息,大连投诉网站有哪些?
如何通过建站之星自助学习解决操作问题?
如何在自有机房高效搭建专业网站?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
建站主机是什么?如何选择适合的建站主机?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
建站之星展会模版如何一键下载生成?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
如何快速搭建高效服务器建站系统?
建站VPS选购需注意哪些关键参数?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何通过NAT技术实现内网高效建站?
如何通过WDCP绑定主域名及创建子域名站点?
如何用景安虚拟主机手机版绑定域名建站?
如何在新浪SAE免费搭建个人博客?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
制作公司内部网站有哪些,内网如何建网站?
如何选择高效便捷的WAP商城建站系统?
实例解析angularjs的filter过滤器
如何快速生成高效建站系统源代码?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
建站之星上传入口如何快速找到?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何在腾讯云服务器快速搭建个人网站?
如何在万网自助建站中设置域名及备案?
实现虚拟支付需哪些建站技术支撑?
如何快速生成ASP一键建站模板并优化安全性?
如何用VPS主机快速搭建个人网站?
建站之星2.7模板:企业网站建设与h5定制设计专题
如何选择适合PHP云建站的开源框架?
*请认真填写需求信息,我们会在24小时内与您取得联系。