【发布时间】:2014-12-15 11:07:16
【问题描述】:
我有一个让我很震惊的问题。
我有一个带有 getter 方法的类(Bar),它返回一个 List:
public abstract class Bar<T extends IdentifiableObject> {
...
public List<Bar> getBars() {
return bars;
}
...
我的层次结构是:
public abstract class Bar<T extends IdentifiableObject>;
public abstract class IdentifiableObject<T extends Comparable<T>>;
直到这里一切正常,问题是当我执行时:
for(Bar bar : bars.getBars()) {
}
上一句抛出编译错误:
incompatible types: java.lang.Object cannot be converted to java.util.List<com.x.Bar>
我对这个错误感到惊讶,但当我执行时我更惊讶
List<Bar> bars = bar.getBars();
Iterator<Bar> iterator = bar.getBars().iterator();
都没有问题
这里的“for”句子有什么问题?
谢谢
【问题讨论】:
-
基本上这是因为您使用的是原始类型
Bar而不是参数化版本。避免像瘟疫这样的原始类型。 -
您还没有在
for示例中说明bars是什么,但无论如何,几乎可以肯定Jon 上面的评论是问题所在。 -
Java 不喜欢将原始类型与泛型混合。尝试使用其中一种。如果您不需要泛型(因为您似乎没有使用
Bar<T>,而是使用Bar)取出泛型。 -
我知道我不应该使用原始类型,但是在这种方法中我不需要知道 Bar 的类型。如您所见, Bar 是抽象的,将在另一个类中专门实现。在这种方法中我不知道我有什么样的 Bar,所以我不知道 Bar 的 T 类型,更不想知道类型,因为这个类不应该访问它的类型。我的问题是...为什么 List
bar = ... 有效而“for”无效? -
这里有同样的问题:stackoverflow.com/questions/5436656/…(引用 Jon 的 java 规范)
标签: java for-loop compilation