在泛型类中将字符串强制转换为数字
问题描述:
我有一个类用于保存可以由用户通过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
。
我该怎么做?
答
当泛型可以使事物变得如此通用以至于它们不再有意义。
在你的情况下,你需要一个setValue,它将采取一个字符串,所以你可以将其转换为适当的类型。这样做的问题是没有办法通用地做到这一点,因为foo
的泛型类型在运行时不可用。
我会有两个子类,一个用于使用Long
的整数,另一个使用Double
或BigDecimal
。这将支持您可能需要的大部分数字类型。
答
你真的不能。所有可能的方法最终都会涉及每种数字类型的特殊情况。
答
这可能是有问题的原因是未来/自定义Number
实现可能不提供此方法,因为它不是合同的一部分。
下面是我想到的两个选项:
使用反射来调用
setValue
方法。使用一对
instanceof
检查和强制转换来覆盖您需要支持的数字。
'instanceof'的问题是您不知道运行时的泛型类型。 – 2012-07-10 10:50:43
难道你不能'如果(价值instanceof龙)...'等? – aioobe 2012-07-10 10:52:19
你可以。在这种情况下,这种情况下的值是一个'String',并且需要将其转换为'Number'类型在运行时是未知的。 – 2012-07-10 10:53:46