Java 装饰器模式,编译器不';不允许类型传播
我正在尝试实现decorator模式,这里是我的规范:Java 装饰器模式,编译器不';不允许类型传播,java,decorator,Java,Decorator,我正在尝试实现decorator模式,这里是我的规范: public abstract class Menu{ //propagate the type } 及 及 问题是编译器为什么不允许这样做: public class Test { Menu sand1 = new Sandwich(); sand1 = new Extra(sand1); //It's fine for the compiler Sandwich sand = new Sandwich(); san
public abstract class Menu{ //propagate the type
}
及
及
问题是编译器为什么不允许这样做:
public class Test {
Menu sand1 = new Sandwich();
sand1 = new Extra(sand1); //It's fine for the compiler
Sandwich sand = new Sandwich();
sand = new Extra (sand);// Compiler cries here !!
}
三明治是一个菜单
通过继承,Extra
的构造函数接受一个菜单
,那么为什么编译器不高兴呢
编译器消息:类型不匹配:无法从Extra转换为Sandwich
谢谢你的澄清 问题不是将
sand
传递给Extra
构造函数,而是试图将新的Extra(sand)
分配给typeSandwich
想象一下这种情况(该Sandwich有一些方法):
所以现在你要做的是:
Sandwich sand = new Sandwich();
sand.addSalad();//works
sand = new Extra (sand);//imagine this doesnt throw errs
sand.addSalad();//will fail as sands not a sandwich anymore
上面的代码将失败。因此,您不允许将非三明治分配给sand。一个
额外的不是三明治
…编译器到底说了什么?@SotiriosDelimanolis我添加了编译器消息好了,我不理解您的困惑。这个问题在错误信息中有详细说明。我明白了,但为什么?因为Sandwich是一个菜单
和Extra
。仅仅因为两个类继承自同一个超类并不意味着它们是相同的。试想一下,Dog
是Animal
而Cat
是Animal
,但是将Dog
变量分配给Cat
类型的实例毫无意义。您说服了我,但在我的情况下,这两个类使用相同的方法,我希望在新的额外(sand)之后得到结果
@akuma8那么这应该是一种菜单方法。沙子应该是菜单,而不是三明治
public class Test {
Menu sand1 = new Sandwich();
sand1 = new Extra(sand1); //It's fine for the compiler
Sandwich sand = new Sandwich();
sand = new Extra (sand);// Compiler cries here !!
}
public class Sandwich extends Menu{
public void addSalad(){
//...
}
}
Sandwich sand = new Sandwich();
sand.addSalad();//works
sand = new Extra (sand);//imagine this doesnt throw errs
sand.addSalad();//will fail as sands not a sandwich anymore