我正在使用 JDK8 javac 1.8.0_05我有一个像这样的界面:

public interface NumberHolder<N extends Number> {
    Optional<String> getNumberName();
}

如您所见,对于NumericHolder的所有子类型,方法getNumberName()返回Optional<String>
但是...当我尝试像这样访问时:

NumberHolder numberHolder = null;
Optional<String> optional = numberHolder.getNumberName(); // warning is here

编译器说:
warning: [unchecked] unchecked conversion
        Optional<String> optional = numberHolder.getNumberName();

但是getNumberName()始终是Optional<String>,所以为什么会引发警告?
有人可以向我解释吗?

最佳答案

存在未指定类型参数的原始类型(即通用类型)的使用仅是为了与前通用代码向后兼容。因此,您不能将泛型方法与原始类型一起使用。这是引入泛型时的设计决策。

您正在使用通用类型NumberHolder的原始类型NumberHolder<N extends Number>。在原始类型上调用方法getNumberName()时,将忽略通用签名,并使用Optional(Optional<String>的原始类型)。然后,将原始类型Optional的返回值分配给通用类型Optional<String>的变量时,将生成警告。

不使用时,无需为type参数指定实际类型。仅将numberHolder的声明从NumberHolder numberHolder更改为NumberHolder<?> numberHolder就足够了。然后,它不再是原始类型,将使用其方法的通用签名,从而使警告消失。

10-08 14:29