我正在使用 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
就足够了。然后,它不再是原始类型,将使用其方法的通用签名,从而使警告消失。