【发布时间】:2013-04-02 18:19:54
【问题描述】:
我有以下通用类:
import java.util.ArrayList;
import java.util.List;
public class GenericRaw<T> {
public List<String> get() {
return new ArrayList<>();
}
}
让我们考虑一下它的用法:
public class Usage {
public void doSomething() {
GenericRaw base = new GenericRaw();
for (String x : base.get()) { }
}
}
对于这段代码,Idea 没有给出任何编译错误,但 Java 编译器本身会给出:
java:不兼容的类型 必需:java.lang.String 找到:java.lang.Object
可在 JDK 1.6.0_33 和 JDK 1.7.0_17 上重现。
有人可以帮我解释一下这个问题吗?
我的调查结果。 可以成功编译以下变体:
public void doSomething() { GenericRaw<?> base = new GenericRaw(); for (String x : base.get()) { } }
甚至:
public void doSomething() { GenericRaw base = new GenericRaw(); List<String> list = base.get(); for (String x : list) { } }
【问题讨论】:
-
我同意它是 http://stackoverflow.com/questions/11007723/combining-raw-types-and-generic-methods 的副本,只是在不同的条件下。
标签: java generics compiler-construction intellij-idea