用泛型时遇到的尴尬问题

    几天前遇到这么一个问题,让我郁闷了半天。当初为了方便定义了以下的一个接口:
public   interface  IBusinessObject < PK  extends  Serializable >   extends  Serializable  {
    PK getPrimaryKey();
    
void setPrimaryKey(PK id);
}

在我的子类中是这么实现的
public   class  Code  implements  IBusinessObject < Long > {
 
private Long primaryKey;
 
public void setPrimaryKey(Long id){
    
this.primaryKey=id;
 }

 
public Long getPrimaryKey(){
    
return primaryKey
 }

}


在通常的实例化过程中,是不会存在问题的。当时的问题是,我定义了另外一个类,用于引用Code
public   class  TestBean  {
    
private Code code;
    
public void setCode(){...}
    
public Code getCode(){...}
}

当在spring环境中时,使用spring的bind类处理的时候,发现,我的code.primaryKey的类型居然为Serializable,而不是我想要的Long
当时以为其他地方搞错了,写了个简单的测试代码
TestBean b = new  TextBean();
BeanWrapperImpl wrapper
= new  BeanWrapperImpl(b);
b.setPropertyValue(
" code.primaryKey " , " 1 " );
assertTrue(b.getCode().getPrimaryKey() 
instanceof  Long);

居然是失败的。
只有在
b.setPropertyValue( " code.primaryKey " , new  Long( 1 ));
assertTrue(b.getCode().getPrimaryKey() 
instanceof  Long);

才成功。
仔细跟踪,发现原来,泛型的时候,产生的编译类中,有两个同名的方法
  public   void  setPrimaryKey(Long id) {
    
this.primaryKey=id;
 }

 
public  Long getPrimaryKey() {
    
return primaryKey
 }


 
public   void  setPrimaryKey(Serializable id) {
    
this.primaryKey=id;
 }

 
public  Serializable getPrimaryKey() {
    
return primaryKey
 }
 

而java.beans规范对于这种情况是没有办法分清楚,所以也就导致了结果和预期的不同。
如果是在程序中,这点算不了问题。可是我需要在web的页面上进行值的绑定,而输入的东西,只能为字符串。所以不可能出来Long类型。
目前,采用了一种比较傻的办法,在TestBean中增加了一个临时变量x,通过x向code传值
如下:
public   void  setWsCode(String wsCode)  {
        
this.wsCode = wsCode;
        
if (StringUtils.isNumeric(wsCode))
            
this.code.setPrimaryKey(NumberUtils.toLong(wsCode));
}
 

不知道还有没有其他好的解决方案。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值