2012-07-10 199 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

相关问题