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>
,它会编译好吗?为什么未定义的变量泛型参数会丢弃它的方法的返回类型的显式泛型参数?
答案 0 :(得分:7)
为什么未定义的变量泛型参数会丢弃它的方法的返回类型的显式泛型参数?
A
是原始类型。这是一种在API中删除了所有泛型的类型,即使是那些具有固定类型参数的泛型。
有关详细信息,请参阅JLS section 4.8和Raw Types section of the Java Generics FAQ。
在这种情况下,如果您想要任何 A
,您可以使用通配符:
public static void test(A<?> i)