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