Java 在泛型类中将字符串强制转换为数字

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; } }

我有一个类,用于保存用户可以通过GUI更改的数值。GUI有一个文本字段(JavaFX),可以在其中写入所需的值

因为我希望这个类是灵活的,所以我使用了如下的泛型:

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)…