【问题标题】:Java "for" compilation errorJava“for”编译错误
【发布时间】: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&lt;T&gt;,而是使用Bar)取出泛型。
  • 我知道我不应该使用原始类型,但是在这种方法中我不需要知道 Bar 的类型。如您所见, Bar 是抽象的,将在另一个类中专门实现。在这种方法中我不知道我有什么样的 Bar,所以我不知道 Bar 的 T 类型,更不想知道类型,因为这个类不应该访问它的类型。我的问题是...为什么 List bar = ... 有效而“for”无效?
  • 这里有同样的问题:stackoverflow.com/questions/5436656/…(引用 Jon 的 java 规范)

标签: java for-loop compilation


【解决方案1】:

如下创建一个 Bar 类的实例:

Bar<?> bar = new Bar();

在您的代码之前添加上述行

List<Bar> bars = bar.getBars();
Iterator<Bar> iterator = bar.getBars().iterator();

【讨论】:

  • 我无法创建抽象类的实例
  • 对不起..我错过了..“bars”在下面的行中包含什么 public List getBars() { return bar; }
  • 它只是用于具有相同类型子节点的树结构
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多