子类的Arraylist不能分配给超类的arraylist

时间:2013-11-12 04:45:25

标签: java inheritance arraylist casting extends

我有一个名为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{

有谁知道我能在这做什么?

1 个答案:

答案 0 :(得分:4)

<强>问题

ArrayList<Block>不会延伸ArrayList<Entity>。 (我简化了一点。)

为什么不呢?

尝试将Entity放入ArrayList<Block>

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

你不能这样做!但是任何ArrayList<Entity>(或其任何子类)都必须能够插入Entity

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

因此,ArrayList<Block>不能被视为ArrayList<Entity>的子类。

<强>解决方案

(1)您可以将grid声明为

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

?中的? extends Entity是“通配符”。这意味着实际类型未知,但必须扩展Entity

这可能对您有用,也可能没用,因为您只能从中获取Entity(除非您在致电get后投出),否则您将无法添加任何内容(因为实际类型未知)。

(2)或者你可以决定你真正想要的是ArrayList<ArrayList<ArrayList<Entity>>>。在那种情况下,它将是冗长的。

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);
}