用泛型时遇到的尴尬问题
来源:互联网 发布:windows建立软链接 编辑:程序博客网 时间:2024/04/30 06:52
几天前遇到这么一个问题,让我郁闷了半天。当初为了方便定义了以下的一个接口:
在我的子类中是这么实现的
在通常的实例化过程中,是不会存在问题的。当时的问题是,我定义了另外一个类,用于引用Code
当在spring环境中时,使用spring的bind类处理的时候,发现,我的code.primaryKey的类型居然为Serializable,而不是我想要的Long
当时以为其他地方搞错了,写了个简单的测试代码
居然是失败的。
只有在
才成功。
仔细跟踪,发现原来,泛型的时候,产生的编译类中,有两个同名的方法
而java.beans规范对于这种情况是没有办法分清楚,所以也就导致了结果和预期的不同。
如果是在程序中,这点算不了问题。可是我需要在web的页面上进行值的绑定,而输入的东西,只能为字符串。所以不可能出来Long类型。
目前,采用了一种比较傻的办法,在TestBean中增加了一个临时变量x,通过x向code传值
如下:
不知道还有没有其他好的解决方案。
public interface IBusinessObject<PK extends Serializable> extends Serializable {
PK getPrimaryKey();
void setPrimaryKey(PK id);
}
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
}
}
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(){...}
}
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);
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);
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
}
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));
}
this.wsCode = wsCode;
if (StringUtils.isNumeric(wsCode))
this.code.setPrimaryKey(NumberUtils.toLong(wsCode));
}
不知道还有没有其他好的解决方案。
- 用泛型时遇到的尴尬问题
- 今天遇到的 很尴尬的问题!!!
- 面试Java遇到的尴尬问题
- 一个尴尬的问题
- 在调试stage3D项目的时候遇到一个很尴尬的问题
- profile遇到Cookie失效时的尴尬
- windows 7 安装 vs2008遇到的尴尬
- 写bat脚本遇到的尴尬事情
- 一个令大人很尴尬的问题
- 记录一个令人尴尬的问题
- 面试时遇到的尴尬的事……
- 初学struts2遇到的一个尴尬404错误
- 偶遇尴尬 MyBatis 问题
- 黑马程序员-帮同学解决问题时发现的问题,尴尬!
- 开发日志:尴尬的Table表单td占多行问题
- iOS 第三方库引发的一些尴尬问题
- Xcode7下面用Unity3D的一些尴尬问题.
- Xcode7下面用Unity3D的一些尴尬问题
- 一个简单的基于System.Web.Mail的ASP.Net邮件发送程序
- 质量事故——警钟长鸣,向《Ajax设计模式与最佳实践》的译者们道歉!
- 如何用DOS命令结束一个进程
- 结束进程的 DOS 命令
- DataTable操作中的性能问题
- 用泛型时遇到的尴尬问题
- 透过IT看人性
- Mozilla Firefox与IE浏览器的javascript兼容性问题
- 紀念我的大伯
- js生成随机数
- 网页病毒清除技巧(中国安全信息网)
- C/C++头文件一览
- ActiveX、OLE和COM介绍
- 在HTTP中,MIME类型被定义在Content-Type header中