繁体   English   中英

将字符串转换为泛型类中的数字

[英]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整数,另一个用于使用DoubleBigDecimal 这将支持您可能需要的大多数数字类型。

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

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

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

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

  • 使用几个instanceof检查和强制转换来覆盖您需要支持的Numbers。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM