Java 在泛型类中将字符串强制转换为数字
我有一个类,用于保存用户可以通过GUI更改的数值。GUI有一个文本字段(JavaFX),可以在其中写入所需的值 因为我希望这个类是灵活的,所以我使用了如下的泛型:Java 在泛型类中将字符串强制转换为数字,java,generics,casting,javafx-2,Java,Generics,Casting,Javafx 2,我有一个类,用于保存用户可以通过GUI更改的数值。GUI有一个文本字段(JavaFX),可以在其中写入所需的值 因为我希望这个类是灵活的,所以我使用了如下的泛型: public class ConfigurableNumericField <T extends Number> { private T value; //... public void setValue(T value){ this.value = value; } }
public class ConfigurableNumericField <T extends Number> {
private T value;
//...
public void setValue(T value){
this.value = value;
}
}
ConfigurableNumericField <Integer> foo = new ConfigurableNumericField <> ( /*...*/ );
public类configurablemericField{
私人T值;
//...
公共无效设置值(T值){
这个值=值;
}
}
我创建了一个这样的对象:
public class ConfigurableNumericField <T extends Number> {
private T value;
//...
public void setValue(T value){
this.value = value;
}
}
ConfigurableNumericField <Integer> foo = new ConfigurableNumericField <> ( /*...*/ );
ConfigurableNumericField foo=新的ConfigurableNumericField(/*…*/);
问题是TextField返回一个字符序列
(可以转换为字符串
)。但是,即使从Number
继承的所有类都有valueOf
方法,Number
也没有它
因此,当我尝试将setValue()
字符串从TextField传递到类本身时。我得到一个java.lang.ClassCastException:java.lang.String不能转换为java.lang.Number
我该怎么做呢?你真的不能。所有可能的方法最终都涉及每种数字类型的特殊情况。你真的不能。所有可能的方法最终都会涉及每种数字类型的特殊情况。这可能有问题的原因是未来/自定义number
实现可能不会提供此方法,因为它不是合同的一部分
以下是我想到的两个选项:
- 使用反射调用
setValue
方法
- 使用两个
instanceof
检查和强制转换来覆盖您需要支持的数字
这可能有问题的原因是,未来的/自定义的编号
实施可能不会提供这种方法,因为它不是合同的一部分
以下是我想到的两个选项:
- 使用反射调用
setValue
方法
- 使用两个
instanceof
检查和强制转换来覆盖您需要支持的数字
当使用泛型时,您可以使事物变得如此泛型,以至于它们不再有意义
在您的情况下,您需要一个setValue,它将接受一个字符串,以便您可以将其转换为适当的类型。这样做的问题是,由于
foo
的泛型类型在运行时不可用,因此无法通用地执行此操作
我将有两个子类,一个用于使用Long
的整数,另一个用于使用Double
或BigDecimal
。这将支持您可能需要的大多数数字类型。当使用泛型时,您可以使事物变得如此泛型,以至于它们不再有意义
在您的情况下,您需要一个setValue,它将接受一个字符串,以便您可以将其转换为适当的类型。这样做的问题是,由于foo
的泛型类型在运行时不可用,因此无法通用地执行此操作
我将有两个子类,一个用于使用Long
的整数,另一个用于使用Double
或BigDecimal
。这将支持您可能需要的大多数数字类型。instanceof
的问题是您在运行时不知道泛型类型。如果(value instanceof Long).等,您不能执行吗?您可以。在本例中,本例中的值是一个字符串
,您需要将其转换为的数字
类型在运行时是未知的。对不起,我的意思是if(this.value instanceof Long).
。instanceof
的问题是您在运行时不知道泛型类型。您不能执行if(value instanceof Long)…
等等?你可以。在本例中,本例中的值是一个字符串
,您需要将其转换为的数字
类型在运行时是未知的。对不起,我的意思是如果(this.value instanceof Long)…
。