[英]Casting a String to a Number in generic class
我有一个类用于保存可由用户通过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
也没有。
所以,当我尝试setValue()
的String
从文本字段类本身。 我得到一个java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number
。
我怎样才能做到这一点?
当泛型时,你可以使事情如此通用,以至于它们不再有意义了。
在您的情况下,您需要一个setValue,它将采用String,以便您可以将其转换为适当的类型。 这个问题是无法通用地执行此操作,因为foo
的泛型类型在运行时不可用。
我将有两个子类,一个用于使用Long
整数,另一个用于使用Double
或BigDecimal
。 这将支持您可能需要的大多数数字类型。
你真的不能。 所有可能的方法最终都涉及每种数字类型的特殊情况。
这可能有问题的原因是未来/自定义Number
实现可能不提供此方法,因为它不是合同的一部分。
以下是我想到的两个选项:
使用反射来调用setValue
方法。
使用几个instanceof
检查和强制转换来覆盖您需要支持的Numbers。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.