3

次のコードを検討してください。

public abstract class Animal<A extends Cage<? extends Animal<A>>>
{
    private A cage;

    public A getCage()
    {
        return this.cage;
    }

    public void setCage(final A cage)
    {
         this.cage = cage;
    }
}

public abstract class Cage<A extends Animal<? extends Cage<A>>>
{
    private List<A> animals;

    public void addAnimal(final A animal)
    {
        if (animal != null)
        {
            animal.setCage(this);

            if (this.animals == null)
            {
                this.animals = new ArrayList<A>();
            }

            this.animals.add(animal);
        }
    }
}

これらのクラスは、他のクラスによってさらに拡張されます。

このコードは次の行でコンパイルに失敗します

animal.setCage(this);

このコードがコンパイルされない理由と修正方法について何か考えはありますか? Java 1.6 を使用しています。

4

3 に答える 3

0

あなたが示した方法については、これで十分だと思われます:

public abstract class Animal<C> {

    private C cage;

    public C getCage() {
        return this.cage;
    }

    public void setCage(final C cage) {
        this.cage = cage;
    }

}

public abstract class Cage<A extends Animal<C>, C> {

    private List<A> animals;

    public abstract C getThis();

    public void addAnimal(final A animal) {
        if (animal != null) {
            animal.setCage(getThis());
            if (this.animals == null) {
                this.animals = new ArrayList<A>();
            }
            this.animals.add(animal);
        }
    }

}

public class CatCage extends Cage<Cat, CatCage> {
    @Override
    public CatCage getThis() { return this; }
}
于 2013-02-12T05:57:04.200 に答える
0

事実上、両方のクラスの A は同じであると言おうとしていますが、そうではないため、コンパイルされません。

ここでジェネリックが必要な理由を正確に確認する必要があると思います。これは確かに簡単になると思います。

于 2013-02-11T10:07:22.833 に答える
-1

これはあなたのニーズに合うはずです:

public abstract class Animal<A extends Cage<C, A>, C extends Animal<A, C>> {

    private A cage;

    public A getCage() {
        return this.cage;
    }

    public void setCage(final A cage) {
        this.cage = cage;
    }

}

public abstract class Cage<A extends Animal<C, A>, C extends Cage<A, C>> {

    private List<A> animals;

    @SuppressWarnings("unchecked")
    public void addAnimal(final A animal) {
        if (animal != null) {
            animal.setCage((C) this);
            if (this.animals == null) {
                this.animals = new ArrayList<A>();
            }
            this.animals.add(animal);
        }
    }

}
于 2013-02-11T10:31:56.040 に答える