如何将通用数据类型传递给方法以及如何创建使用它的正确方法?

时间:2011-12-04 14:31:14

标签: java generics

我想将一些方法重构为一个方法,用于根据方法参数将字符串值转换为int / float。为此,我创建了一个方法如下:

private <T>Number setNumericValue(String value , T type)
{

    value = value.trim();
    if(isNumeric(value))
    {
        if (type instanceof Integer)
            return Integer.parseInt(value);
        if (type instanceof Float)
            return Float.parseFloat(value);

    }
    return 0;
}

首先我想知道我的方法是否正确? 并且为了调用这个方法我该如何使用它?我创建了这样的东西,但java给了我运行时错误

this.temperatureC = setNumericValue(temperatureC, Float);

错误说:“无法将Float转换为T”

3 个答案:

答案 0 :(得分:3)

你可以这样做:

private <T extends Number> T setNumericValue(String value , Class<T> type)
{

    value = value.trim();
    if(isNumeric(value))
    {
        if (type.isAssignableFrom(Float.class))
            return type.cast(Float.valueOf(value));
        if (type.isAssignableFrom(Integer.class))
            return type.cast(Integer.valueOf(value));
    }
    return type.getConstructor(String.class).newInstance("0");
}
this.temperatureC = setNumericValue(temperatureC, Float.class);

答案 1 :(得分:2)

如果您将方法的签名更改为(以及相应的实现)

private <T extends Number> T setNumericValue( String value, Class<T> classType)

你可以用

来调用它
this.temperatureC = setNumericValue( temperatureC, Float.class )

答案 2 :(得分:1)

您还需要返回相应类型的默认值:

private <T extends Number> T setNumericValue(String value, Class<T> type) {
    value = value.trim();
    if (isNumeric(value)) {
        if (type.isAssignableFrom(Float.class))
            return type.cast(Float.parseFloat(value));
        if (type.isAssignableFrom(Integer.class))
            return type.cast(Integer.parseInt(value));
    } else {
        if (type.isAssignableFrom(Float.class))
            return type.cast(Float.valueOf(0));
        if (type.isAssignableFrom(Integer.class))
            return type.cast(Integer.valueOf(0));
    }

    throw new IllegalArgumentException(String.format(
            "Cannot convert '%s' to %s", value, type.getSimpleName()
    ));
}

您的原始构造不是类型安全的,您无法将原始值转换为T extends Number。 Java的原始类型包装器也不支持使用Class.cast在不同的数字类型之间进行转换,因此您必须明确地执行此操作。