2012-07-10 200 views
1

我有一個類用於保存可以由用戶通過GUI更改的數值。 GUI有一個TextField(JavaFX),可以在其中編寫所需的值。在泛型類中將字符串強制轉換爲數字

因爲我想這個類是靈活的我做了使用泛型這個樣子:

public class ConfigurableNumericField <T extends Number> { 

    private T value; 
    //... 
    public void setValue(T value){ 
     this.value = value; 
    } 
} 

我創建一個對象是這樣的:

ConfigurableNumericField <Integer> foo = new ConfigurableNumericField <> (/*...*/); 

的問題是,在文本字段返回CharacterSequence(可以鑄造到String)。但即使所有從Number繼承的類都有valueOf方法,Number也沒有。

所以當我嘗試setValue()String從TextField到類本身。我得到一個java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number

我該怎麼做?

回答

2

當泛型可以使事物變得如此通用以至於它們不再有意義。

在你的情況下,你需要一個setValue,它將採取一個字符串,所以你可以將其轉換爲適當的類型。這樣做的問題是沒有辦法通用地做到這一點,因爲foo的泛型類型在運行時不可用。

我會有兩個子類,一個用於使用Long的整數,另一個使用DoubleBigDecimal。這將支持您可能需要的大部分數字類型。

1

你真的不能。所有可能的方法最終都會涉及每種數字類型的特殊情況。

1

這可能是有問題的原因是未來/自定義Number實現可能不提供此方法,因爲它不是合同的一部分。

下面是我想到的兩個選項:

  • 使用反射來調用setValue方法。

  • 使用一對instanceof檢查和強制轉換來覆蓋您需要支持的數字。

+0

'instanceof'的問題是您不知道運行時的泛型類型。 – 2012-07-10 10:50:43

+0

難道你不能'如果(價值instanceof龍)...'等? – aioobe 2012-07-10 10:52:19

+0

你可以。在這種情況下,這種情況下的值是一個'String',並且需要將其轉換爲'Number'類型在運行時是未知的。 – 2012-07-10 10:53:46

相關問題