我正在使用一些带有泛型的代码,我不确定为什么会抛出编译错误。
public static void main(String[] args) {
System.out.print("s");
setInteger(prepareNumber("1")); // Error here! solved by casting: setInteger((Integer)prepareNumber("1"))
Integer c = prepareInteger("1");
System.out.print(c);
}
public static Integer prepareInteger(Object number) {
return prepareNumber(number).intValue();
}
private static <T extends Number> T prepareNumber(Object number) {
T returnValue = null;
// handle a blank number
if (number == null || !NumberUtils.isNumber(number.toString())) {
returnValue = null;
} else {
if (number.toString().contains(".")) {
returnValue = (T) Double.valueOf(number.toString());
} else {
returnValue = (T) Integer.valueOf(number.toString());
}
}
return returnValue;
}
private static void setInteger(Integer a){
}
只需进行转换即可轻松解决此问题,但这是不希望的,因为泛型应检测到该方法需要一个 Integer 并且应该提供返回值而不是父类(super class)型。
PS:不要介意解析代码,只是测试的东西。
谢谢!
最佳答案
在这种情况下,编译器无法推断 prepareNumber("1")
应该返回什么类型。您可以通过将结果放在一个临时变量中来使其正确推断:
Integer value = prepareNumber("1");
setInteger(value);
或者如果 parseNumber
是类 YourClass
中的静态方法,您可以明确地告诉编译器您期望的类型,如下所示:
setInteger(YourClass.<Integer>prepareNumber("1"));
或者如果您愿意更改方法签名以帮助编译器:
setInteger(prepareNumber("1", Integer.class));
private static <T extends Number> T prepareNumber(Object number, Class<T> classType) {
....
}
关于java - 通用方法在分配给变量时返回正确的对象,但在与方法一起使用时不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13162766/