Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有循环泛型依赖项的泛型类型的编译错误_Java_Generics - Fatal编程技术网

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

Java 具有循环泛型依赖项的泛型类型的编译错误,java,generics,Java,Generics,考虑以下代码: 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 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);
        }
    }
}

关于为什么这段代码不能编译以及如何修复它,有什么想法吗?我们使用的是Java 1.6。

实际上,您试图说两个类中的A是相同的,而实际上不是,因此它不会编译


我认为您应该仔细检查一下为什么需要泛型,我认为这肯定会更简单。

这应该适合您的需要:

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

}
公共抽象类动物{
私人牢笼;
公共getCage(){
归还这个笼子;
}
公共无效设置框架(最终A框架){
this.cage=cage;
}
}
公共抽象类框架{
私人动物名录;
@抑制警告(“未选中”)
公共动物(最终A动物){
if(动物!=null){
动物。设置笼((C)本);
if(this.anies==null){
this.anives=新的ArrayList();
}
这个。动物。添加(动物);
}
}
}

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

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; }
}
公共抽象类动物{
私人C笼;
公共C getCage(){
归还这个笼子;
}
公共无效集合笼(最终C笼){
this.cage=cage;
}
}
公共抽象类框架{
私人动物名录;
公共摘要C getThis();
公共动物(最终A动物){
if(动物!=null){
动物。setCage(getThis());
if(this.anies==null){
this.anives=新的ArrayList();
}
这个。动物。添加(动物);
}
}
}
公共类CatCage扩展Cage{
@凌驾
公共CatCage getThis(){返回此;}
}

你能试一下吗:1°)
类动物
;2°)
类笼
;3°)
animal.setCage((C)this)?谢谢@sp00m,这很有效!好东西。如果你加上这个作为答案,我会接受它,这样你就可以得到这个建议的荣誉。不客气,我已经给出了一个真实的答案。@newact我猜
这个
C
可以铸造的东西,我错了吗?或者在什么情况下,
可能是
C
以外的另一种类型?例如,
类狗扩展动物
类狗笼扩展笼子
,以及
另一类狗笼扩展笼子
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; }
}