java 泛型多重限制_[改善Java代码]严格限定泛型类型采用多重界限

从哲学上来说,很难描述一个具体的人,你可以描述它的长相,性格,工作等,但是人都是有多重身份的,估计只有使用多个And(与操作)将所有的描述串联起来才能描述一个完整的人,人在不同的环境中角色也在不断的更换.

用Java程序来对一类人进行管理,比如在公交车费优惠系统中,对部分人员,工资低于2500元的上班族而且是站立着的乘客 车费打8折.

这里的类型参数有两个限制条件,一为上班族,二为乘客,具体到程序中就是一个泛型参数有两个上界Upper Bound,首先定义两个接口以及实现类:

1 //职员

2 interfaceStaff{3 //工资

4 public intgetSalary();5 }6

7 //乘客

8 interfacePassenger{9 //是否是站立状态

10 public booleanisStanding();11 }12

13 class Me implementsStaff,Passenger{14 public booleanisStanding(){15 return true;16 }17

18 public intgetSalary() {19 return 2000;20 }21 }

Me这种类型的人物有很多,不同的人都可能站着,但是他们的工资实现很可能不同.

也就是说使用 T extends Me 是限定不了需求对象的.

可以考虑使用多重限定,看代码:

1 public classClient {2 //工资低于2500元的上斑族并且站立的乘客车票打8折

3 public static voiddiscount(T t){4 if(t.getSalary()<2500 &&t.isStanding()){5 System.out.println("恭喜你!您的车票打八折!");6 }7 }8 public static voidmain(String[] args) {9 discount(newMe());10 }11 }

使用"&"符号设定多重边界Multi Bounds 指定泛型类型T必须是Staff和Passenger的共有子类型,此时变量t就 有了限定的方法和属性.

在Java的泛型中,可以使用&符号关联多个上界并实现多个边界限定,而且只有上界才有此限定.

下界没有多重限定的情况.

多个下界,编码者可以自行推断出具体的类型.比如"? super Integer"和"? super Double"可以细化为Number类型了,或者Object类型了,无需编译器推断了.

为什么要说明多重边界?

因为编码者太少使用它了.比如一个判断用户权限的方法,使用的是策略模式Startegy Pattern,实例代码:

importjava.util.Arrays;importjava.util.List;public class UserHandler{//判断用户是否有权限执行操作

public boolean permit(T user, Listjobs) {

List> iList =Arrays.asList(user.getClass().getInterfaces());//判断是否是管理员

if (iList.indexOf(Admin.class) > -1) {

Admin admin=(Admin) user;/*判断管理员是否有此权限*/}else{/*判断普通用户是否有此权限*/}return false;

}

}interfaceUser {

}class UserImpl implementsUser, Admin {

}interfaceAdmin {

}classJob {

}

此处进行了一次泛型参数类别判断,这里不仅仅违背了单一职责原则,而且已经使用泛型限定参数的边界了,还要进行泛型类型的判断.

事实上,使用多重边界可以很方便的解决问题,而且非常优雅,建议读者在开发中考虑使用多重限定.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值