论坛首页 Java企业应用论坛

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

浏览 1402 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-28  

项目中老代码用到了一个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) 




 

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics