我在使用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的子类型
从该方法中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] 删除。
我来说两句