Java:泛型和未经检查 - 为什么?

m-s*_*lik 1 java generics syntax-error java-8

我使用的是JDK8,javac 1.8.0_05 我有这样的界面:

public interface NumberHolder<N extends Number> {        
    Optional<String> getNumberName();
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,NumericHolder方法getNumberName()返回的所有子类型Optional<String>.
但是......当我尝试访问它时:

NumberHolder numberHolder = null;
Optional<String> optional = numberHolder.getNumberName(); // warning is here
Run Code Online (Sandbox Code Playgroud)

编译器说:

warning: [unchecked] unchecked conversion 
        Optional<String> optional = numberHolder.getNumberName();
Run Code Online (Sandbox Code Playgroud)

getNumberName()总是Optional<String>这样,为什么提出这个警告呢?
有人可以解释一下吗?

Hol*_*ger 7

原始类型的使用,即不指定类型参数的泛型类型,仅用于与前通用代码向后兼容.因此,您不能将泛型方法与原始类型一起使用.这是Generics推出时的设计决策.

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

不使用时,不需要为type参数指定实际类型.只是改变的声明numberHolderNumberHolder numberHolderNumberHolder<?> numberHolder就足够了.然后,它不再是原始类型,并且将使用其方法的通用签名,使警告消失.