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

时间:2013-06-17 19:20:43

标签: java generics

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

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

incompatible types
required: String
found:    Object

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

1 个答案:

答案 0 :(得分:7)

  

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

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

有关详细信息,请参阅JLS section 4.8Raw Types section of the Java Generics FAQ

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

public static void test(A<?> i)