几天前遇到这么一个问题,让我郁闷了半天。当初为了方便定义了以下的一个接口:
<pk extends="" serializable="">
</pk>
java 代码
- public interface IBusinessObject《PK extends Serializable> extends Serializable {
- PK getPrimaryKey();
- void setPrimaryKey(PK id);
- }
在我的子类中是这么实现的
java 代码
- public class Code implements IBusinessObject〈Long〉<long>{ </long>
- private Long primaryKey;
- public void setPrimaryKey(Long id){
- this.primaryKey=id;
- }
- public Long getPrimaryKey(){
- return primaryKey
- }
- }
在通常的实例化过程中,是不会存在问题的。当时的问题是,我定义了另外一个类,用于引用Code
java 代码
- public class TestBean {
- private Code code;
- public void setCode(){...}
- public Code getCode(){...}
- }
当在spring环境中时,使用spring的bind类处理的时候,发现,我的code.primaryKey的类型居然为Serializable,而不是我想要的Long
当时以为其他地方搞错了,写了个简单的测试代码
java 代码
- TestBean b=new TextBean();
- BeanWrapperImpl wrapper=new BeanWrapperImpl(b);
- b.setPropertyValue("code.primaryKey","1");
- assertTrue(b.getCode().getPrimaryKey() instanceof Long);
居然是失败的。
只有在
java 代码
- b.setPropertyValue("code.primaryKey",new Long(1));
- assertTrue(b.getCode().getPrimaryKey() instanceof Long);
才成功。
仔细跟踪,发现原来,泛型的时候,产生的编译类中,有两个同名的方法
java 代码
- 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传值
如下:
java 代码
- public void setWsCode(String wsCode) {
- this.wsCode = wsCode;
- if (StringUtils.isNumeric(wsCode))
- this.code.setPrimaryKey(NumberUtils.toLong(wsCode));
- }
不知道还有没有其他好的解决方案。
分享到:
相关推荐
泛型允许我们在定义类、接口、委托和方法时,不指定具体的类型参数,而是使用一个占位符,如`T`、`K`等。这样,当我们实例化这些泛型类型时,可以传入任何类型的参数,从而实现泛型类型的实例化。例如,你可以创建一...
类型参数是在定义类时使用的占位符,实际的类型在创建类的实例时指定。例如,我们可以创建一个名为`GenericContainer<T>`的泛型类,其中`T`就是类型参数。这个类可以存储任何类型的对象,但具体类型在实例化时确定。...
使用泛型后,在集合操作中添加元素时,编译器会检查元素的数据类型,确保类型的一致性,减少运行时的类型错误。同时,泛型还提高了代码的复用性,因为一个泛型类或方法可以适用于多种数据类型,而无需为每种数据类型...
当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑...
泛型允许我们在类、接口和方法中使用类型参数,这样在编译时期就能检查类型匹配,减少运行时类型转换异常。 1. **泛型的基本概念** - 泛型的本质是在类、接口或方法中使用类型参数,让它们能够处理多种数据类型。...
在使用 Java 泛型时,我们可能会遇到与非泛型代码交互的情况。例如,当我们需要将一个非泛型列表转换为泛型列表时: ```java List rawList = new ArrayList(); // 非泛型列表 List<String> stringList = new ...
- **类型实参**:使用泛型时实际传入的具体类型。例如,在`List<String>`中,`String`就是类型实参。 - **通配符**:用于表示不确定类型的占位符,例如`?`代表任何类型。 #### 泛型的动机 在Java泛型出现之前,集合...
- **DAO设计**:在设计DAO层时,可以使用泛型,创建如`GenericDAO, ID extends Serializable>`这样的基类,实现基本的CRUD操作,提高代码复用。 4. **泛型基础概念** - **类型参数**:如`<T>`,表示一个未指定...
例如,当我们尝试将不同类型的对象放入ArrayList并试图进行类型转换时,可能会在运行时遇到InvalidCastException。下面是一个简单的示例,展示了这个问题: ```csharp ArrayList list = new ArrayList(); list.Add...
泛型集合提供了一种高效且灵活的方式来处理各种类型的数据,同时保持了编译时的类型检查。下面将详细探讨C#泛型集合的使用及其相关知识点。 1. **泛型接口与类** C#中的泛型接口如`IEnumerable<T>`和泛型类如`List...
然而,在使用泛型时需要注意一些问题,本文将详细讨论四个泛型相关的问题。 一、泛型类型引用传递问题 在Java中,像`ArrayList<String> arrayList1 = new ArrayList()`这样的引用传递是不允许的。这是因为,泛型...
通过泛型,我们可以创建可重复使用的组件,这些组件能在处理不同数据类型时保持一致的行为,同时确保编译时的类型检查,避免了运行时的ClassCastException。 **二、泛型的优点** 1. **类型安全**:泛型确保了在...
C#泛型是一种强大的编程工具,它允许在不指定具体数据类型的情况下定义类、接口和方法。这使得代码更具灵活性,同时保持了编译时类型安全性和运行时的高效...如果你在实践中遇到任何问题,都可以在文档中留言寻求帮助。
编译时泛型类似于C++中的模板,通过编译时实例化来处理不同类型,而CLI泛型则在运行时进行实例化,这使得泛型类型的实例化延迟到JIT编译阶段,从而避免了可能的代码膨胀问题,并且提供了丰富的元数据用于反射。...
"泛型、泛型擦除、桥接方法" 泛型是一种类型参数化技术,允许开发者在编写代码时指定类型,提高代码的灵活性和可重用性。...但是,在使用泛型时,需要注意泛型擦除的影响,避免出现类型安全问题。
想象一个基于Spring框架的Java应用程序,其中使用了泛型的DAO层来处理各种实体类的数据操作。在这样的场景下,`GenericUtil`类可以被用来动态获取每个DAO实例所处理的实体类型,进而执行特定于该类型的数据库操作,...
泛型学习和泛型接口和泛型经典示例
为了解决这个问题,可以使用泛型来解决。 2. 在泛型里面写是一个对象,String 不能写基本的数据类型比如 int,要写基本的数据类型对应的包装类。基本数据类型对应包装类如下所示: 基本数据类型 | 对应包装类 ----...