为什么未定义的变量泛型参数会丢弃它的方法返回类型的显式泛型参数?

Tim*_*kov 2 java generics

public abstract class A<T> {
    public static void test(A i) { for (String s : i.get()) {} }
    public abstract Iterable<String> get();
}
Run Code Online (Sandbox Code Playgroud)

为什么上面的代码我得到:

incompatible types
required: String
found:    Object
Run Code Online (Sandbox Code Playgroud)

但是如果我将test方法的参数改为A<Object>,它会编译好吗?为什么未定义的变量泛型参数会丢弃它的方法返回类型的显式泛型参数?

Jon*_*eet 7

为什么未定义的变量泛型参数会丢弃它的方法返回类型的显式泛型参数?

A是一种原始类型.这是一种类型,在API中删除了所有泛型,即使是具有固定类型参数的泛型.

有关详细信息,请参阅Java Generics FAQJLS第4.8节Raw Types部分.

在这种情况下,如果你想要的任何 A,你可以使用通配符:

public static void test(A<?> i)
Run Code Online (Sandbox Code Playgroud)