-2

私はこれらのクラスを持っています

class SuperParent {
        @Override
        public String toString() {

            return "SuperParent";
        }
    }

    class A extends SuperParent {

        @Override
        public String toString() {

            return "A";
        }
    }

    class B extends SuperParent {

        @Override
        public String toString() {

            return "B";
        }

    }

Listそして、私はArrayListsを持ちたいので、BとAのArrayListに追加できます。

List<ArrayList<?extends SuperParent>> mList = new ArrayList<ArrayList<SuperParent>>();

しかし、コンパイルされません

私がこれを試したとき、

ArrayList<ArrayList<SuperParent>> mList = new ArrayList<SuperParent>>();

コンパイルされますがArrayListAsまたはArrayListsBのs を追加できません

私はJavaの型と継承も理解していますが、ジェネリックスに関してはそれが恋しいです。どんな参照や宣言も私を助けてくれるでしょう。

4

2 に答える 2

1

これは、外側のリストの要素がAのリストまたはBのリストである可能性があるリストのリストを宣言する方法です。

ArrayList<ArrayList<? extends SuperParent>> lists = 
    new ArrayList<ArrayList<? extends SuperParent>>();
lists.add(new ArrayList<A>(Arrays.asList(new A(), new A())));
lists.add(new ArrayList<B>(Arrays.asList(new B(), new B())));

一般に、メソッドパラメータとして宣言または受け入れる場合は、具象型よりもインターフェイス型を使用することをお勧めします。そうすれば、上記のスニペットは次のようになります。

List<List<? extends SuperParent>> lists = 
    new ArrayList<List<? extends SuperParent>>();
lists.add(Arrays.asList(new A(), new A()));
lists.add(Arrays.asList(new B(), new B()));
于 2012-09-03T15:56:30.797 に答える
0

あなたが正確に何を試したかはわかりませんが、これは私にとってはうまくいきます:

public class SuperParent
{

@Test
public void testThatAddThowsNoExceptions()
{
    List<ArrayList<? extends SuperParent>> mList = new ArrayList<ArrayList<? extends SuperParent>>();
    ArrayList<SuperParent> firstList = new ArrayList<SuperParent>();
    firstList.add(new SuperParent());
    firstList.add(new A());
    firstList.add(new B());
    mList.add(firstList);
}

public String toString()
{

    return "SuperParent";
}

class A extends SuperParent
{

    @Override
    public String toString()
    {

        return "A";
    }
}

class B extends SuperParent
{

    @Override
    public String toString()
    {

        return "B";
    }

}

}
于 2012-09-03T15:59:13.450 に答える