1700447444
1700447445
//定义“我”这个类型的人
1700447446
1700447447
class Me implements Staff, Passenger{
1700447448
1700447449
public boolean isStanding(){
1700447450
1700447451
return true;
1700447452
1700447453
}
1700447454
1700447455
public int getSalary(){
1700447456
1700447457
return 2000;
1700447458
1700447459
}
1700447460
1700447461
}
1700447462
1700447463
“Me”这种类型的人物有很多,比如做系统分析师也是一个职员,也坐公交车,但他的工资实现就和我不同,再比如Boss级的人物,偶尔也坐公交车,对大老板来说他也只是一个职员,他的实现类也不同,也就是说如果我们使用“T extends Me”是限定不了需求对象的,那该怎么办呢?可以考虑使用多重限定,代码如下:
1700447464
1700447465
//工资低于2500元的上班族并且站立的乘客车票打8折
1700447466
1700447467
public static<T extends Staff&Passenger>void discount(T t){
1700447468
1700447469
if(t.getSalary()<2500&&t.isStanding()){
1700447470
1700447471
System.out.println(“恭喜你!您的车票打八折!”);
1700447472
1700447473
}
1700447474
1700447475
}
1700447476
1700447477
public static void main(String[]args){
1700447478
1700447479
discount(new Me());
1700447480
1700447481
}
1700447482
1700447483
使用“&”符号设定多重边界(Multi Bounds),指定泛型类型T必须是Staff和Passenger的共有子类型,此时变量t就具有了所有限定的方法和属性,要再进行判断就易如反掌了。
1700447484
1700447485
在Java的泛型中,可以使用“&”符号关联多个上界并实现多个边界限定,而且只有上界才有此限定,下界没有多重限定的情况。想想你就会明白:多个下界,编码者可自行推断出具体的类型,比如“?super Integer”和“?extends Double”,可以更细化为Number类型了,或者Object类型了,无须编译器推断了。
1700447486
1700447487
为什么要说明多重边界?是因为编码者太少使用它了,比如一个判断用户权限的方法,使用的是策略模式(Strategy Pattern),示意代码如下:
1700447488
1700447489
public class UserHandler<T extends User>{
1700447490
1700447491
//判断用户是否有权限执行操作
1700447492
1700447493
public boolean permit(T user, List<Job>jobs){
[
上一页 ]
[ :1.700447444e+09 ]
[
下一页 ]