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>。(少し簡略化しました。)

なぜだめですか?

に を入れてみてEntityくださいArrayList<Block>

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

あなたはそれを行うことはできません !ただし、任意の(またはそのサブクラス) にはs を挿入ArrayList<Entity>できる必要があります。Entity

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

したがって、ArrayList<Block>のサブクラスと見なすことはできませんArrayList<Entity>

ソリューション

grid(1) 次のように宣言できます。

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

?inは「? extends Entityワイルドカード」です。これは、実際の型が不明であることを意味しますが、拡張する必要がありますEntity

Entityこれは、( を呼び出した後にキャストしない限り) から sしか取得できず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 に答える