`
zyl
  • 浏览: 486280 次
社区版块
存档分类
最新评论

用泛型时遇到的尴尬问题

    博客分类:
  • jdk
阅读更多
    几天前遇到这么一个问题,让我郁闷了半天。当初为了方便定义了以下的一个接口:
<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. }  

不知道还有没有其他好的解决方案。
分享到:
评论
9 楼 zyl 2007-04-17  
ajoo 写道
把setPrimaryKey放在IBusinessObject接口中的用意是什么?

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

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

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


有理,在真正设计的时候是不应该的,我只是举了一个例子而已。
8 楼 ajoo 2007-04-17  
把setPrimaryKey放在IBusinessObject接口中的用意是什么?

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

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

setSomething一般来说都是在构造对象的时候用,构造好了,对象最好保持immutable。
7 楼 jamesby 2007-04-17  
我估计应该是《PK extends Serializable>
6 楼 wensky222 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>
5 楼 rainlife 2007-04-17  
zyl 写道
rainlife 写道
把你的泛型体符号改成中文状态的,不然是会让rich editor过滤掉的。

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

是的啊,我就是在中文状态下的“〈〉”,这样就可以了。
4 楼 hbcui1984 2007-04-17  
ing,关注中
3 楼 xly_971223 2007-04-17  
public interface IBusinessObject extends Serializable> extends Serializable {  
    PK getPrimaryKey();  
    void setPrimaryKey(PK id);  
}  

这段代码正确的格式是什么样的?
没看明白
2 楼 zyl 2007-04-17  
rainlife 写道
把你的泛型体符号改成中文状态的,不然是会让rich editor过滤掉的。

修改了很多遍了,原来是这么回事情。
1 楼 rainlife 2007-04-17  
把你的泛型体符号改成中文状态的,不然是会让rich editor过滤掉的。

相关推荐

    c# 泛型的使用,教你如何用泛型

    泛型允许我们在定义类、接口、委托和方法时,不指定具体的类型参数,而是使用一个占位符,如`T`、`K`等。这样,当我们实例化这些泛型类型时,可以传入任何类型的参数,从而实现泛型类型的实例化。例如,你可以创建一...

    C#泛型类、泛型方法、泛型接口、泛型委托的实例

    类型参数是在定义类时使用的占位符,实际的类型在创建类的实例时指定。例如,我们可以创建一个名为`GenericContainer&lt;T&gt;`的泛型类,其中`T`就是类型参数。这个类可以存储任何类型的对象,但具体类型在实例化时确定。...

    JAVA-泛型课件-泛型课件

    使用泛型后,在集合操作中添加元素时,编译器会检查元素的数据类型,确保类型的一致性,减少运行时的类型错误。同时,泛型还提高了代码的复用性,因为一个泛型类或方法可以适用于多种数据类型,而无需为每种数据类型...

    泛型dao 泛型dao 泛型dao

    当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑...

    泛型java的泛型知识,非常有用

    泛型允许我们在类、接口和方法中使用类型参数,这样在编译时期就能检查类型匹配,减少运行时类型转换异常。 1. **泛型的基本概念** - 泛型的本质是在类、接口或方法中使用类型参数,让它们能够处理多种数据类型。...

    java泛型指南 经典

    在使用 Java 泛型时,我们可能会遇到与非泛型代码交互的情况。例如,当我们需要将一个非泛型列表转换为泛型列表时: ```java List rawList = new ArrayList(); // 非泛型列表 List&lt;String&gt; stringList = new ...

    泛型笔记学习2009

    - **类型实参**:使用泛型时实际传入的具体类型。例如,在`List&lt;String&gt;`中,`String`就是类型实参。 - **通配符**:用于表示不确定类型的占位符,例如`?`代表任何类型。 #### 泛型的动机 在Java泛型出现之前,集合...

    SSH泛型代码实例

    - **DAO设计**:在设计DAO层时,可以使用泛型,创建如`GenericDAO, ID extends Serializable&gt;`这样的基类,实现基本的CRUD操作,提高代码复用。 4. **泛型基础概念** - **类型参数**:如`&lt;T&gt;`,表示一个未指定...

    vs2008 泛型 的使用 实例

    例如,当我们尝试将不同类型的对象放入ArrayList并试图进行类型转换时,可能会在运行时遇到InvalidCastException。下面是一个简单的示例,展示了这个问题: ```csharp ArrayList list = new ArrayList(); list.Add...

    C#泛型集合使用实例

    泛型集合提供了一种高效且灵活的方式来处理各种类型的数据,同时保持了编译时的类型检查。下面将详细探讨C#泛型集合的使用及其相关知识点。 1. **泛型接口与类** C#中的泛型接口如`IEnumerable&lt;T&gt;`和泛型类如`List...

    泛型需要注意的问题Java系列2021.pdf

    然而,在使用泛型时需要注意一些问题,本文将详细讨论四个泛型相关的问题。 一、泛型类型引用传递问题 在Java中,像`ArrayList&lt;String&gt; arrayList1 = new ArrayList()`这样的引用传递是不允许的。这是因为,泛型...

    java 1.5泛型详解

    通过泛型,我们可以创建可重复使用的组件,这些组件能在处理不同数据类型时保持一致的行为,同时确保编译时的类型检查,避免了运行时的ClassCastException。 **二、泛型的优点** 1. **类型安全**:泛型确保了在...

    C#泛型实例Demo

    C#泛型是一种强大的编程工具,它允许在不指定具体数据类型的情况下定义类、接口和方法。这使得代码更具灵活性,同时保持了编译时类型安全性和运行时的高效...如果你在实践中遇到任何问题,都可以在文档中留言寻求帮助。

    VC++ 2005:泛型编程

    编译时泛型类似于C++中的模板,通过编译时实例化来处理不同类型,而CLI泛型则在运行时进行实例化,这使得泛型类型的实例化延迟到JIT编译阶段,从而避免了可能的代码膨胀问题,并且提供了丰富的元数据用于反射。...

    泛型,泛型擦除,桥接方法

    "泛型、泛型擦除、桥接方法" 泛型是一种类型参数化技术,允许开发者在编写代码时指定类型,提高代码的灵活性和可重用性。...但是,在使用泛型时,需要注意泛型擦除的影响,避免出现类型安全问题。

    泛型工具类

    想象一个基于Spring框架的Java应用程序,其中使用了泛型的DAO层来处理各种实体类的数据操作。在这样的场景下,`GenericUtil`类可以被用来动态获取每个DAO实例所处理的实体类型,进而执行特定于该类型的数据库操作,...

    泛型学习和泛型接口和泛型经典示例

    泛型学习和泛型接口和泛型经典示例

    Java泛型使用详细分析.pdf

    为了解决这个问题,可以使用泛型来解决。 2. 在泛型里面写是一个对象,String 不能写基本的数据类型比如 int,要写基本的数据类型对应的包装类。基本数据类型对应包装类如下所示: 基本数据类型 | 对应包装类 ----...

Global site tag (gtag.js) - Google Analytics