请考虑以下代码:
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。
答案 0 :(得分:0)
实际上,你试图说两个类中的A是相同的,它不是,因此它不会编译。
我认为你应该仔细检查一下你在这里需要泛型的原因,我认为这当然可以更简单。
答案 1 :(得分: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; }
}
答案 2 :(得分:-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);
}
}
}