閑人野居
          好好學習,天天向上
          posts - 57,  comments - 137,  trackbacks - 0
              幾天前遇到這么一個問題,讓我郁悶了半天。當初為了方便定義了以下的一個接口:
          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規范對于這種情況是沒有辦法分清楚,所以也就導致了結果和預期的不同。
          如果是在程序中,這點算不了問題??墒俏倚枰趙eb的頁面上進行值的綁定,而輸入的東西,只能為字符串。所以不可能出來Long類型。
          目前,采用了一種比較傻的辦法,在TestBean中增加了一個臨時變量x,通過x向code傳值
          如下:
          public void setWsCode(String wsCode) {
                  
          this.wsCode = wsCode;
                  
          if (StringUtils.isNumeric(wsCode))
                      
          this.code.setPrimaryKey(NumberUtils.toLong(wsCode));
          }

          不知道還有沒有其他好的解決方案。


          posted on 2007-04-17 08:22 布衣郎 閱讀(1584) 評論(1)  編輯  收藏 所屬分類: jdk相關

          FeedBack:
          # re: 用泛型時遇到的尷尬問題
          2007-04-17 17:57 | aaa
          確實是個問題,hibernate映射的時候必須指定類型為Long,不然就被認成Serialiazable,xwork2的ValueStack是可以認出來精確的類型,但是在jdk6.0下面還是不行.
          應該用java.lang.reflection.Method.getGenericReturnType()而不是用getReturnType()  回復  更多評論
            

          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(12)

          隨筆分類(59)

          隨筆檔案(57)

          blog

          java

          uml

          搜索

          •  

          積分與排名

          • 積分 - 357861
          • 排名 - 156

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 贡觉县| 三门峡市| 呼伦贝尔市| 蒲城县| 库尔勒市| 黔南| 内丘县| 拉萨市| 五常市| 永德县| 台湾省| 白山市| 弋阳县| 临朐县| 西林县| 聊城市| 五指山市| 陆丰市| 祁门县| 齐齐哈尔市| 万宁市| 友谊县| 库尔勒市| 曲水县| 永城市| 青阳县| 科技| 樟树市| 滦南县| 遵义县| 灯塔市| 定结县| 顺昌县| 阿瓦提县| 清流县| 郴州市| 噶尔县| 中西区| 晋城| 阿拉善右旗| 聊城市|