泛型类型推断的一个奇怪问题

尼特什:

我在使用Java8的泛型中有一种奇怪的行为。

这是一个演示该问题的小示例代码。以下代码可以正常工作,而类型推断没有任何问题。其中,SpecificError是GenericError的子类型。

public GenericType<AbstractError> method{
   Optional<SpecificError> error = Optional.of(new SpecificError());
   if (error.isPresent()) {
    return GenericType.error(error.get());
  } else {
     // return something else
  }
}

我在代码中有很多这样的地方,如果不得不对if进行可选的其他检查,我决定创建一个新函数,该函数接收Optional,检查是否存在并返回泛型类型对象New函数代码:

public static <R extends AbstractError> GenericType<R> shortcut(Optional<R> error) {
    if (error.isPresent()) {
      return GenericType.error(error.get());
    } else {
    // something else
    }
}

这是调用上述函数的新代码:

public GenericType<AbstractError> method{

       Optional<SpecificError> error = Optional.of(new SpecificError());
       return GenericType.shortcut(error);
    }

奇怪的是,这行不通,并破坏了以下编译错误:

[ERROR]     inferred: AbstractError

[ERROR]     equality constraints(s): AbstractError, SpecificError

我只是不明白,为什么这行不通。我唯一要做的是做一个小的功能,要做的工作是对Optional进行Present检查,其他一切都一样。Java为什么看不到SpecificError是AbstractError的子类型

MC皇帝

从该方法中method(),您正在调用GenericType.shortcut(error)where error的类型Optional<SpecificError>shortcut需要一个类型实参R,您正在尝试实现R = SpecificError因此,您尝试返回a GenericType<SpecificError>,但是您的方法签名声明其返回a GenericType<AbstractError>

A GenericType<SpecificError>不是a GenericType<AbstractError>,因为泛型是不变的

您可以通过替换来解决此问题

Optional<SpecificError> error = Optional.of(new SpecificError());

Optional<AbstractError> error = Optional.of(new SpecificError());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章