2

我正在使用一些带有泛型的代码,我不确定为什么会抛出编译错误。

  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 并且应该提供返回值而不是超类型。

PS:不要介意解析代码,只是测试的东西。

谢谢!

4

2 回答 2

1

在这种情况下,编译器无法推断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) {
   ....
}
于 2012-10-31T16:55:01.733 回答
0

prepareNumber 方法返回 Number 的类型,它是 Integer 的超类,但是您的 setInteger 正在接受 Integer 并且在这种情况下没有隐式转换。

于 2012-10-31T16:50:12.810 回答