Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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_Decorator - Fatal编程技术网

Java 装饰器模式,编译器不';不允许类型传播

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

我正在尝试实现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();
  sand = new Extra (sand);// Compiler cries here !!
}
三明治
是一个菜单
通过继承,
Extra
的构造函数接受一个
菜单
,那么为什么编译器不高兴呢

编译器消息:
类型不匹配:无法从Extra转换为Sandwich


谢谢你的澄清

问题不是将
sand
传递给
Extra
构造函数,而是试图将
新的Extra(sand)
分配给type
Sandwich
想象一下这种情况(该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