[改善Java代码]严格限定泛型类型采用多重界限
从哲学上来说,很难描述一个具体的人,你可以描述它的长相,性格,工作等,但是人都是有多重身份的,估计只有使用多个And(与操作)将所有的描述串联起来才能描述一个完整的人,人在不同的环境中角色也在不断的更换.
用Java程序来对一类人进行管理,比如在公交车费优惠系统中,对部分人员,工资低于2500元的上班族而且是站立着的乘客 车费打8折.
这里的类型参数有两个限制条件,一为上班族,二为乘客,具体到程序中就是一个泛型参数有两个上界Upper Bound,首先定义两个接口以及实现类:
//职员
interface Staff{
//工资
public int getSalary();
} //乘客
interface Passenger{
//是否是站立状态
public boolean isStanding();
} class Me implements Staff,Passenger{
public boolean isStanding(){
return true;
} public int getSalary() {
return 2000;
}
}
Me这种类型的人物有很多,不同的人都可能站着,但是他们的工资实现很可能不同.
也就是说使用 T extends Me 是限定不了需求对象的.
可以考虑使用多重限定,看代码:
public class Client {
//工资低于2500元的上斑族并且站立的乘客车票打8折
public static <T extends Staff & Passenger> void discount(T t){
if(t.getSalary()<2500 && t.isStanding()){
System.out.println("恭喜你!您的车票打八折!");
}
}
public static void main(String[] args) {
discount(new Me());
}
}
使用"&"符号设定多重边界Multi Bounds 指定泛型类型T必须是Staff和Passenger的共有子类型,此时变量t就 有了限定的方法和属性.
在Java的泛型中,可以使用&符号关联多个上界并实现多个边界限定,而且只有上界才有此限定.
下界没有多重限定的情况.
多个下界,编码者可以自行推断出具体的类型.比如"? super Integer"和"? super Double"可以细化为Number类型了,或者Object类型了,无需编译器推断了.
为什么要说明多重边界?
因为编码者太少使用它了.比如一个判断用户权限的方法,使用的是策略模式Startegy Pattern,实例代码:
import java.util.Arrays;
import java.util.List; public class UserHandler<T extends User>{
// 判断用户是否有权限执行操作
public boolean permit(T user, List<Job> jobs) {
List<Class<?>> iList = Arrays.asList(user.getClass().getInterfaces());
// 判断是否是管理员
if (iList.indexOf(Admin.class) > -1) {
Admin admin = (Admin) user;
/* 判断管理员是否有此权限 */
} else {
/* 判断普通用户是否有此权限 */
}
return false;
}
} interface User { } class UserImpl implements User, Admin { } interface Admin { } class Job { }
此处进行了一次泛型参数类别判断,这里不仅仅违背了单一职责原则,而且已经使用泛型限定参数的边界了,还要进行泛型类型的判断.
事实上,使用多重边界可以很方便的解决问题,而且非常优雅,建议读者在开发中考虑使用多重限定.
[改善Java代码]严格限定泛型类型采用多重界限的更多相关文章
- [改善Java代码]不同的场景使用不同的泛型通配符
Java泛型支持通配符(Wildcard),可以单独使用一个"?"表示任意类,也可以使用extends关键字标识某一类(接口)的子类型,还可以使用super关键字标识某一类(接口) ...
- [改善Java代码]易变业务使用脚本语言编写
建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...
- [改善Java代码]数组的真实类型必须是泛型类型的子类型
List接口的toArray方法可以把一个结合转化为数组,但是使用不方便,toArray()方法返回的是一个Object数组,所以需要自行转变. toArray(T[] a)虽然返回的是T类型的数组, ...
- [改善Java代码]建议采用的顺序是 List<T>、List<?>、List<Object>
建议98:建议采用的顺序是 List<T>.List<?>.List<Object> List<T>.List<?>.List<Obj ...
- [改善Java代码] 枚举项数量限定为64个以内
建议89:枚举项的数量限制在64个以内 为了更好的使用枚举,java 提供了两个枚举集合:EnumSet和EnumMap,这两个集合的使用都比较简单,EnumSet表示其元素必须是某一枚举的枚举项,E ...
- [改善Java代码]非稳定排序推荐使用List
我们知道Set与List的最大区别就是Set中的元素不可以重复(这个重复指的equals方法的返回值相等),其他方面则没有太大的区别了,在Set的实现类中有一个比较常用的类需要了解一下:TreeSet ...
- [改善Java代码]集合运算时使用更优雅的方式
在初中代数中,我们经常会求两个集合的并集.交集.差集等,在Java中也存在着此 类运算,那如何实现呢? 一提到此类集合操作,大部分的实现者都会说:对两个集合进行遍历,即可求出结果.是的,遍历可以实现并 ...
- [改善Java代码]不同的列表选择不同的遍历方法
一.场景: 我们来看一个场景,统计一个省的各科高考科目考试的平均分. 当然使用数据库中的一个SQL语句就能求出平均值,不过这个不再我们的考虑之列,这里只考虑使用纯Java的方式来解决.(由于我的机器配 ...
- [改善Java代码]枚举和注解结合使用威力更大
注解的写法和接口很类似,都采用了关键字interface,而且都不能有实现代码,常量定义默认都是pulbic static final类型的. 他们的主要不同点是:注解在interface前加上@字符 ...
随机推荐
- flask中的request.form对象方法
'add','clear','copy','deepcopy','fromkeys','get','gtlist','has_key','items','iteritems','iterkeys',' ...
- POJ 1751 Highways (kruskal)
题目链接:http://poj.org/problem?id=1751 题意是给你n个点的坐标,然后给你m对点是已经相连的,问你还需要连接哪几对点,使这个图为最小生成树. 这里用kruskal不会超时 ...
- POJ 3922A Simple Stone Game
题目链接 A Sample Stone Game 题目大意:给定n,k,表示最初时有n个石头,两个人玩取石子游戏,第一个人第一次可以取1~n-1个石头,后面每个人最多可以拿走前面一个人拿走的个数的K倍 ...
- poj3687
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9028 Accepted: 2444 De ...
- Linux命令行访问网页
找到个好资料,备份行: http://hi.baidu.com/oyvfhp/blog/item/3aa5ced5b40563d351da4bb0.html CURL --- 命令行浏览器 这东西 ...
- MSSQL索引优化
转自:http://blog.itpub.net/16436858/viewspace-589275/ http://www.cnblogs.com/jams742003/archive/2011/1 ...
- Oracle-11g-R2(11.2.0.3.x)RAC Oracle Grid & Database 零宕机方式升级 PSU(自动模式)
升级环境: 1.源库版本: Grid Infrastructure:11.2.0.3.13 Database:11.2.0.3.13 2.目标库版本: Grid Infrastructure:11.2 ...
- mysql全库备份数据库脚本
#!/bin/sh DATE=`date +%Y%m%d` DEL_DATE=$(date -d '-30 days' "+%Y%m%d") HOST USER=admin PAS ...
- RealSense 3D实感体验:前景广阔目前应用少
腾讯数码讯(周硕)在去年的IDF大会上,英特尔着重展示了其全新的RealSense 3D实感技术,而厚度仅6mm堪称史上最薄平板的戴尔Venue 8 7000也成为首个搭载RealSense技术的产品 ...
- TChromeTabs 使用日记
1.如何让 Tab 在拖放时,拖放图形中带有 TabControl 的内容. 增加 ChromeTabs 的 NeedDragImageControl 事件,并在代码中设置 DragControl 为 ...