将字符串转换为泛型类中的数字

时间:2012-07-10 10:44:44

标签: java generics casting javafx-2

我有一个类用于保存可由用户通过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 <> ( /*...*/ );

问题是TextField返回CharacterSequence(可以转换为String)。但即使从Number继承的所有类都使用valueOf方法,Number也没有。{/ p>

所以当我尝试setValue()从TextField到类本身的String时。我得到了java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number

我该怎么做?

3 个答案:

答案 0 :(得分:2)

当使用泛型时,你可以使事物如此通用,以至于它们不再有意义了。

在您的情况下,您需要一个setValue,它将采用String,以便您可以将其转换为适当的类型。这样做的问题是无法通用地执行此操作,因为foo的泛型类型在运行时不可用。

我会有两个子类,一个用于使用Long的整数,另一个用于DoubleBigDecimal。这将支持您可能需要的大多数数字类型。

答案 1 :(得分:1)

你真的不能。所有可能的方法最终都涉及每种数字类型的特殊情况。

答案 2 :(得分:1)

这可能有问题的原因是未来/自定义Number实施可能不提供此方法,因为它不是合同的一部分。

以下是两个选项:

  • 使用反射来调用setValue方法。

  • 使用一些instanceof支票和演员表来覆盖您需要支持的数字。