java - 通用方法在分配给变量时返回正确的对象,但在与方法一起使用时不返回

标签 java generics

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

  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/

相关文章:

Java泛型,通配符的嵌套集合

子类中的 Java 泛型和有界参数

java - 领域驱动设计——如何在 UI 上使用值对象

java - 如何从 jlist 中删除一个项目

java - 如何从 hibernate 中同一个表的结果中获取表中的数据

java - Android Studio - 如何更改图像资源?

java - 在 GWT 中关闭窗口时执行代码

generics - Kotlin 泛型继承

c# - 如何创建具有不同类型的单个元素的类型安全数组或集合?

java - 将泛型应用于 java.util.Function