具有循环泛型依赖项的泛型类型的编译错误



考虑以下代码:

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。

实际上,你试图说两个类中的A是相同的,但事实并非如此,因此它不会编译。

我认为你应该确切地回顾一下为什么你需要仿制药,我认为这肯定会更简单。

对于您所展示的方法,这似乎已经足够了:

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

这应该适合您的需求:

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

最新更新