【问题标题】:Arraylist of subclass can not be assigned to arraylist of superclass子类的数组列表不能分配给超类的数组列表
【发布时间】:2013-11-24 02:54:57
【问题描述】:

我有一个名为 grid 的数组,声明如下:

public ArrayList<ArrayList<ArrayList<Entity>>> grid;

我尝试这样设置:

grid = ctgf.blockMap;

在 ctgf 中的 blockMap 是这样声明的:

public ArrayList<ArrayList<ArrayList<Block>>> blockMap = new ArrayList<ArrayList<ArrayList<Block>>>();

为了澄清,Block 类是这样扩展的:

public class Block extends Entity{

有人知道我可以在这里做什么吗?

【问题讨论】:

  • ArrayList&lt;Block&gt;ArrayList&lt;Entity&gt; 的子类型吗?
  • 你想做什么?

标签: java inheritance arraylist casting extends


【解决方案1】:

问题

ArrayList&lt;Block&gt; 不扩展 ArrayList&lt;Entity&gt;。 (我简化了一点。)

为什么不呢?

尝试将Entity 放入ArrayList&lt;Block&gt;

new ArrayList<Block>().add(new Entity());

你做不到!但是任何ArrayList&lt;Entity&gt;(或其任何子类)都必须能够插入Entitys。

new ArrayList<Entity>().add(new Entity());

因此,ArrayList&lt;Block&gt; 不能被视为ArrayList&lt;Entity&gt; 的子类。

解决方案

(1) 您可以将grid 声明为

public ArrayList<? extends ArrayList<? extends ArrayList<? extends Entity>>> grid;

? extends Entity 中的 ? 是一个“通配符”。表示实际类型未知,但必须扩展Entity

这可能对你有用也可能没用,因为你只能从中获取Entitys(除非你在调用get 之后进行施法),并且你不能向它添加任何东西(因为实际类型未知)。

(2) 或者你可以决定你真正想要的是ArrayList&lt;ArrayList&lt;ArrayList&lt;Entity&gt;&gt;&gt;。在这种情况下,它会很冗长。

grid = new ArrayList<ArrayList<ArrayList<Entity>>>();
for(ArrayList<ArrayList<Block> blockList1 : ctgf.blockMap) {
    ArrayList<ArrayList<Entity>> entityList1 = new ArrayList<ArrayList<Entity>>();
    for(ArrayList<Block> blockList2: blockList1) {
        entityList1.add(new ArrayList<Entity>(blockList2));
    }
    grid.add(entityList1);
}

【讨论】:

  • 我喜欢你的第二个解决方案,但强制转换有意义吗?
  • +1 没问题 :) 现在要删除我的答案,因为它似乎已经过时了。
  • 它没有用。我更改了网格声明,但我得到了同样的错误。
  • @PaulDraper 现在它给了我Incompatible types. Required: ArrayList &lt;java.util.ArrayList&lt;Entity&gt;&gt; Found: ArrayList &lt;Entity&gt;,我不知道你的 for 循环是如何工作的,我还没有在 HS Programming 2 中学习过。
  • @AidanEdwards,我相信您的最后评论是关于第二种解决方案的?我也解决了这个问题。
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 2021-09-10
相关资源
最近更新 更多