我想将一些方法重构为一个方法,用于根据方法参数将字符串值转换为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”
答案 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
在不同的数字类型之间进行转换,因此您必须明确地执行此操作。