2

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

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

4

1 回答 1

4

问题

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

为什么不?

尝试将Entitya放入ArrayList<Block>.

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

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

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

因此,ArrayList<Block>不能被视为ArrayList<Entity>.

解决方案

(1) 您可以声明grid

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

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

这可能对您有用,也可能没有用,因为您只能从中获取Entitys (除非您在调用 后强制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);
}
于 2013-11-12T04:47:39.897 回答