我有一个新手问题。
interface Animal {
void partner(Animal other);
}
class Lion implements Animal {
int areaUnderControl;
@Override
public void partner(Animal other) {
Lion lion = (Lion) other;
this.areaUnderControl += lion.areaUnderControl;
}
}
class Human implements Animal {
int money;
@Override
public void partner(Animal other) {
Human human = (Human) other;
this.money += human.money;
}
}
我希望具体实现中的合作伙伴方法只接收其类型或其子类型的参数。一种解决方案是使用泛型将 Animal 定义为:
interface Animal<T extends Animal<T>> {
void partner(T other);
}
class Lion implements Animal<Lion> {
int areaUnderControl;
@Override
public void partner(Lion other) {
this.areaUnderControl += other.areaUnderControl;
}
}
class Human implements Animal<Human> {
int money;
@Override
public void partner(Human other) {
this.money += other.money;
}
}
但是有人仍然可以滥用它作为
class Bear implements Animal<Lion> {
int honey;
@Override
public void partner(Lion other) {
this.honey += other.areaUnderControl; //Problem
}
}
熊渴望与狮子合作。有没有办法可以将它与这个的类型和子类型联系起来
我尝试搜索现有的问题,不知何故我觉得界面本身的设计可能存在缺陷。如果有人能指出为什么这是错误的或实现这一目标的正确方法,将不胜感激。
谢谢!