【问题标题】:Casting problems with ArrayList [duplicate]ArrayList的铸造问题[重复]
【发布时间】:2015-12-26 07:32:10
【问题描述】:

我不知道如何正确编写它,所以它不会产生编译器错误:

class AnElement implements IElement { ... }

protected ArrayList<AnElement> someElements() {
    ...
}

protected ArrayList<IElement> elements() {
    return (ArrayList<IElement>) someElements(); // this doesn't work...
    // return someElements();                    // ... neither does this
}

这样做的正确方法是什么?

【问题讨论】:

  • hmm.. 刚刚意识到 Element 这个词对于这个例子来说并不是最好的,只是我把它作为我在真实代码中使用的实际课程的一部分
  • 定义不起作用。什么编译器错误?你认为它们是什么意思?
  • IDE 中出现“不兼容的类型”错误。 IDE 在代码下方有一条大红线。必需:ArrayList,找到:ArrayList
  • @SotiriosDelimanolis:你说得对,这是一个更好的欺骗目标。我会重新打开这个,你可以作为一个骗子重新关闭?

标签: java


【解决方案1】:

泛型是不变的,所以你可以这样做

protected List<? extends IElement> elements() {
    return someElements(); 
}

【讨论】:

  • 或者更好的是,对接口进行编码并改为使用protected List&lt;IElement&gt; someElements()
  • @MickMnemonic 可能不会编译为编译器无法确定 IElement 的确切实现是从 someElements.....:)
  • 它确实使用原始代码编译。
  • 一般来说,您应该避免返回通配符类型,而是返回最具体的类型。惊人的 Angelika Langer explains why。 (当IElementinterface 时,可能不会有太大的不同,但仍然如此。)
  • 实际上是的,基础是一个接口 IElement.. 但是还有 AnElement 实现了 IElement 和 ChildOfAnElement 扩展了 AnElement... 等等。我简化了原始帖子中的内容。基本上所有对象都保证是 IElement ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多