1

我有一个类用于保存用户可以通过 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 返回 a CharacterSequence(可以转换为String)。但是,即使所有继承自的类Number都有该valueOf方法,Number也没有它。

因此,当我尝试setValue()StringTextField 到类本身时。我得到一个java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number.

我怎样才能做到这一点?

4

3 回答 3

2

当泛型时,您可以使事物变得如此通用以至于它们不再有意义。

在您的情况下,您需要一个 setValue ,它将采用 String 以便您可以将其转换为适当的类型。这样做的问题是没有办法通用地做到这一点,因为通用类型foo在运行时不可用。

我将有两个子类,一个用于使用 a 的整数,Long另一个用于使用 a Doubleor BigDecimal。这将支持您可能需要的大多数数字类型。

于 2012-07-10T10:50:10.517 回答
1

你真的不能。所有可能的方法最终都涉及每种数字类型的特殊情况。

于 2012-07-10T10:47:27.183 回答
1

这可能有问题的原因是未来/自定义Number实现可能不提供此方法,因为它不是合同的一部分。

以下是我想到的两个选项:

  • 使用反射来调用setValue方法。

  • 使用一些instanceof检查和强制转换来覆盖您需要支持的数字。

于 2012-07-10T10:47:57.413 回答