我有这样的类(class):
abstract class Person{void toDrink(Liquid l);}
class Liquid{}
class Alcohol extend Liquid{}
class Milk extends Liquid{}
class Adult extends Person{void toDrink(Liquid l){}}
class Child extends Person{void toDrink(Liquid l){}}
我希望 child 和成人不要分别采用液体作为参数,而是分别采用牛奶和酒精,但我必须用精确的液体参数覆盖抽象方法。所以当我写的时候
Person child = new Child();
child.toDrink(new Alcohol());
child 可以把酒精当作喝酒的理由。 我可以使用 Exceptions 或 if() 来解决这个问题,但我请你建议我对这些关系有更好的设计。当我向 toDrink() 方法传递错误的参数(向 child 传递酒精或向成人传递牛奶)时,我想要它,当我尝试运行它时,我的 IDE 将其强调为错误和编译错误。
最佳答案
你可以像下面这样创建吗?
abstract class Person<T extends Liquid>{
void toDrink(T l) {
}
}
在上面的代码中,您绑定(bind)了 toDrink()
方法来接受扩展 Liquid
的类型
class Adult<T extends Alcohol> extends Person<T>{
void toDrink(T l){
}
}
class Child<T extends Milk> extends Person<T>{
void toDrink(T l){
}
}
在上面的代码中,您绑定(bind)了 Adult
和 Child
方法的 toDrink()
以接受扩展 的类型分别是酒精
和牛奶
。
现在,正如您所期望的,下面的代码失败了(出现编译错误)
Person<Milk> child = new Child<Milk>();
child.toDrink(new Alcohol()); // error here
但是这个有效
child.toDrink(new Milk());
关于Java重写抽象方法设计策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17189450/