2011-12-29 34 views
3

從1.4到1.5,除了documented ones之外,似乎還有許多未公開的更改。如何將自定義BigDecimal轉換器設置爲Wicket 1.5中的TextField <BigDecimal>?

在1.4我有:

new TextField<BigDecimal>("capitalInput", 
     new PropertyModel<BigDecimal>(model, "capital")) { 
    @Override 
    public IConverter getConverter(Class<?> type) { 
     return new MonetaryBigDecimalConverter(); 
    } 
}; 

1.5,我改變了像這樣(以匹配getConverter()現在是如何申報):

new TextField<BigDecimal>("capital", 
     new PropertyModel<BigDecimal>(model, "capital")) { 
    @Override 
    public <C> IConverter<C> getConverter(Class<C> type) { 
     return new MonetaryBigDecimalConverter(); 
    } 
}; 

我的哪個IDE顯示爲剛剛選中分配警告。但隨後試圖建立項目它實際上是一個編譯錯誤

incompatible types 
found : com.company.MonetaryBigDecimalConverter 
required: org.apache.wicket.util.convert.IConverter<C> 

定製MonetaryBigDecimalConverter看起來是這樣的(1.5):

public class MonetaryBigDecimalConverter extends BigDecimalConverter { 
    @Override 
    public String convertToString(BigDecimal value, Locale locale) { 
     // ... 
    } 
} 

我怎麼能再次使這項工作?

+0

如果BigDecimalConverter是來自wicket的BigDecimalConverter,那麼它應該工作,因爲它實現了IConverter 。否則,您可以嘗試在自己的轉換器上實現該接口。哪個*應該*已經遵循合同... – Nicktar 2011-12-29 13:31:32

+0

上面的BigDecimalConverter *是來自Wicket,我實際上已經嘗試向MonetaryBigDecimalConverter添加(冗餘)IConverter ,但這並沒有幫助... – Jonik 2011-12-29 13:44:40

回答

3

由於檢票1.5轉換器有一個泛型類型參數:

IConverter<C> 

注意#getConverter的類型參數C()未綁定到你的文本字段的類型參數,所以你應該測試請求的類型:

new TextField<BigDecimal>("capital", 
     new PropertyModel<BigDecimal>(model, "capital")) { 
    @Override 
    public <C> IConverter<C> getConverter(Class<C> type) { 
     if (type == BigDecimal) { 
      return (IConverter<C>) new MonetaryBigDecimalConverter(); 
     } else { 
      return super.getConverter(type); 
     } 
    } 
}; 

你有你的轉換器明確地轉換爲所請求的IConverter安靜的編譯器。或者用你的解決方法,你可以放入原始類型,從而避開問題。

+1

謝謝! Wicket API在這裏看起來並不理想。 (我當然想要在TextField 的情況下返回IConverter - 儘管我不確定Java泛型和Wicket體系結構是否可行。) – Jonik 2012-01-02 13:12:53

0

我不知道爲什麼,但下面的getConverter方法的小改動使它編譯。

@Override 
public <C> IConverter<C> getConverter(Class<C> type) { 
    IConverter converter = new MonetaryBigDecimalConverter(); 
    return converter; 
} 

我剛萃取MonetaryBigDecimalConverter實例爲varible IConverter類型。一個字段或常量可以類似地工作。 (注意:類型必須爲而不是IConverter<C>IConverter<BigDecimal>。)該代碼仍會產生「未檢查的賦值」警告,但至少會編譯它。

如果有人添加了解釋或更好的解決方案,我將不勝感激。當談到Java泛型怪異時,我當然不是專家。

相關問題