我有一个类用于保存可由用户通过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
。
我该怎么做?
答案 0 :(得分:2)
当使用泛型时,你可以使事物如此通用,以至于它们不再有意义了。
在您的情况下,您需要一个setValue,它将采用String,以便您可以将其转换为适当的类型。这样做的问题是无法通用地执行此操作,因为foo
的泛型类型在运行时不可用。
我会有两个子类,一个用于使用Long
的整数,另一个用于Double
或BigDecimal
。这将支持您可能需要的大多数数字类型。
答案 1 :(得分:1)
你真的不能。所有可能的方法最终都涉及每种数字类型的特殊情况。
答案 2 :(得分:1)
这可能有问题的原因是未来/自定义Number
实施可能不提供此方法,因为它不是合同的一部分。
以下是两个选项:
使用反射来调用setValue
方法。
使用一些instanceof
支票和演员表来覆盖您需要支持的数字。