首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java泛型和数值类型

Java泛型和数值类型
EN

Stack Overflow用户
提问于 2013-04-16 06:27:02
回答 5查看 10.2K关注 0票数 8

我想创建一个通用方法,它可以有效地完成以下工作:

代码语言:javascript
复制
class MyClass {

    static <T extends Number> T sloppyParseNumber(String str) {
        try {
            return T.valueOf(str);
        } catch (Exception e) {
            return (T)0;
        }
    }
}

现在,上面没有编译的原因有两个:没有Number.valueOf()方法,不能将0转换为T

示例用法:

代码语言:javascript
复制
String value = "0.00000001";

System.out.println("Double: " + MyClass.<Double>sloppyParseNumber(value));
System.out.println("Float: " + MyClass.<Float>sloppyParseNumber(value));

double d = MyClass.sloppyParseNumber(value);
float f = MyClass.sloppyParseNumber(value);

是否可以用Java实现上述泛型方法?如果是,怎么做?如果没有,什么是好的替代方法?

编辑:似乎有一些可能的重复,但我没有找到一个,这正好涵盖了这一点。我希望有一些技巧可以拉,这将允许这两个操作:将字符串解析到一个Number子类,并为一个Number子类返回0值。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-16 06:55:41

我百分之百同意TofuBeer。但是,如果您希望避免时间上的冗长,也应该这样做:

代码语言:javascript
复制
static <T extends Number> T sloppyParseNumber(String str,Class<T> clas) {

    if (clas == null) throw new NullPointerException("clas is null");

    try {

        if(clas.equals(Integer.class)) {
            return (T) Integer.valueOf(str);
        }
        else if(clas.equals(Double.class)) {
            return (T) Double.valueOf(str);
        }
        //so on

    catch(NumberFormatException|NullPointerException ex) {
        // force call with valid arguments
        return sloppyParseNumber("0", clas);
    }

    throw new IllegalArgumentException("Invalid clas " + clas);

}

但是纯粹从T,您不能在运行时获得类型。

票数 3
EN

Stack Overflow用户

发布于 2013-04-16 06:41:14

Java泛型只提供编译时间检查,并且类型信息在编译后几乎会被丢弃。因此,T.valueOf语句在Java中是不可能的。解决方案是按照注释中已经提到的详细方式进行。另外,您为什么要执行MyClass.<Double>sloppyParseNumber(value)而不是MyClass.sloppyParseDouble(value),因为您在编译时指定了类型吗?

票数 3
EN

Stack Overflow用户

发布于 2013-04-16 06:46:19

静态方法是由类型绑定的,因为类型充其量是,NumberNumber没有一个valueOf方法--您所追求的方法不起作用。

最简单的方法就是做一些静态的方法,比如sloppyParseIntsloppyParseFloat等等.

您可以这样做,不确定我是否喜欢它,并且可能可以在以下方面进行改进:

代码语言:javascript
复制
public class Main 
{
    private static final Map<Class<? extends Number>, NumberConverter> CONVERTERS;

    static
    {
        CONVERTERS = new HashMap<>();
        CONVERTERS.put(Integer.class, new IntegerConverter());
    }

    public static void main(String[] args) 
    {
        Number valueA;
        Number valueB;

        valueA = CONVERTERS.get(Integer.class).convert("42");
        valueB = CONVERTERS.get(Integer.class).convert("Hello, World!");

        System.out.println(valueA);
        System.out.println(valueB);
    }
}

interface NumberConverter<T extends Number>
{
    T convert(String str);
}

class IntegerConverter
    implements NumberConverter<Integer>
{
    @Override
    public Integer convert(String str) 
    {
        try
        {
            return Integer.valueOf(str);
        } 
        catch (NumberFormatException ex) 
        {
            return 0;
        }    
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16030157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档