用范型限制传入两个相同类型的参数

项目中老代码用到了一个beanCopy

static void  beanCopy(Object source,Object target);




这个代码是自己实现的,对于所有的getter都只考虑了getXX的形式,像boolan isAlive()之类的就无能为力了。这次想改成用apach的beanUtils,结果出了bug。检查下来发现居然有人把这个方法用在了不同对象上

Man man=null; 
Woman woman=null; 
BeanHelper.beanCopy(man,woman); 



考虑到这么作是有问题的,就想找出项目中所有这样的用法。

最初的想法很简单,把方法签名改成范型,不同类型的对拷就会报编译错误,一个个改掉就行。

static <T>  void beanCopy (T source, T target); 
可是这么改了居然没用,细细一看,由于编译器会自动推导T的类型。所以beanCopy  ("a",1)

会被自动推导成

 extends <Object>; void GenericType.b(? extends Object a, ? extends Object b) 


 

那么怎么办呢?想了一下,解决办法是先把签名改成这样, 这样所有 target不是source子类的调用都会报错

static <S, T extends S>   void beanCopy(S  source,T target) 


然后再把S和T颠倒一下,让所有source不是target子类的调用报错   

static  <T, S extends T>  void beanCopy(S  source,T target)



两下综合一下,就得到最后结果了。


话说回来,其实我是很想这样定义的,可惜这被认为是"Illegal forward reference to type parameter T",不支持啊!

static  <S extends T,T extends S>  void beanCopy3(S  source,T target) 




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值