2
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>,它会编译好吗?为什么变量的未定义泛型参数会丢弃其方法返回类型的显式泛型参数?

4

1 回答 1

7

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

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

有关更多信息,请参阅 Java Generics FAQ 的JLS 部分 4.8Raw Types 部分

在这种情况下,如果需要any A,可以使用通配符:

public static void test(A<?> i)
于 2013-06-17T19:22:47.380 回答