论坛首页 Java企业应用论坛

用泛型时遇到的尴尬问题

浏览 4225 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-17  
OO
    几天前遇到这么一个问题,让我郁闷了半天。当初为了方便定义了以下的一个接口:
<pk extends="" serializable="">
</pk>
java 代码
 
  1. public interface IBusinessObject《PK extends Serializable> extends Serializable {  
  2.     PK getPrimaryKey();  
  3.     void setPrimaryKey(PK id);  
  4. }  

在我的子类中是这么实现的
java 代码
 
  1. public class Code implements IBusinessObject〈Long〉<long>{  </long>
  2.  private Long primaryKey;  
  3.  public void setPrimaryKey(Long id){  
  4.     this.primaryKey=id;  
  5.  }  
  6.  public Long getPrimaryKey(){  
  7.     return primaryKey  
  8.  }  
  9. }  

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

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

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

才成功。
仔细跟踪,发现原来,泛型的时候,产生的编译类中,有两个同名的方法
java 代码
 
  1.  public void setPrimaryKey(Long id){  
  2.     this.primaryKey=id;  
  3.  }  
  4.  public Long getPrimaryKey(){  
  5.     return primaryKey  
  6.  }  
  7. 和  
  8.  public void setPrimaryKey(Serializable id){  
  9.     this.primaryKey=id;  
  10.  }  
  11.  public Serializable getPrimaryKey(){  
  12.     return primaryKey  
  13.  }   

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

不知道还有没有其他好的解决方案。
   发表时间:2007-04-17  
把你的泛型体符号改成中文状态的,不然是会让rich editor过滤掉的。
0 请登录后投票
   发表时间:2007-04-17  
rainlife 写道
把你的泛型体符号改成中文状态的,不然是会让rich editor过滤掉的。

修改了很多遍了,原来是这么回事情。
0 请登录后投票
   发表时间:2007-04-17  
public interface IBusinessObject extends Serializable> extends Serializable {  
    PK getPrimaryKey();  
    void setPrimaryKey(PK id);  
}  

这段代码正确的格式是什么样的?
没看明白
0 请登录后投票
   发表时间:2007-04-17  
zyl 写道
rainlife 写道
把你的泛型体符号改成中文状态的,不然是会让rich editor过滤掉的。

修改了很多遍了,原来是这么回事情。

是的啊,我就是在中文状态下的“〈〉”,这样就可以了。
0 请登录后投票
   发表时间:2007-04-17  
public class Code implements IBusinessObject〈Long>{
	/**
	 * 
	 */
	private static final long serialVersionUID = 3597703574715596659L;
	private Long primaryKey;

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

	public Long getPrimaryKey(){  
	     return primaryKey;  
	  }
	
	

}

我用的jdk1.5,代码只有这样才能编译通过增加 〈Long>
0 请登录后投票
   发表时间:2007-04-17  
我估计应该是《PK extends Serializable>
0 请登录后投票
   发表时间:2007-04-17  
把setPrimaryKey放在IBusinessObject接口中的用意是什么?

如果只有getPrimaryKey()就应该没事了。

我一般不太喜欢在接口中放上getSomething()和setSomething(),这样很限制灵活性(比如不容易写proxy, decorator之类)。

setSomething一般来说都是在构造对象的时候用,构造好了,对象最好保持immutable。
0 请登录后投票
   发表时间:2007-04-17  
ajoo 写道
把setPrimaryKey放在IBusinessObject接口中的用意是什么?

如果只有getPrimaryKey()就应该没事了。

我一般不太喜欢在接口中放上getSomething()和setSomething(),这样很限制灵活性(比如不容易写proxy, decorator之类)。

setSomething一般来说都是在构造对象的时候用,构造好了,对象最好保持immutable。


有理,在真正设计的时候是不应该的,我只是举了一个例子而已。
0 请登录后投票
论坛首页 Java企业应用版

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