我有一个接口,它是和枚举Commodity
的超类型。另外,还有一个具有多个构造函数的类:Item
Consumable
Option
class Option{
Option(Item c,int price){. . .}
Option(Consumable c,int price){. . .}
Option(Commodity c,int price){
this(c.getClass()!=Commodity.class?c.getClass().cast(c):Item.EMPTY,price);
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译器认为这将导致无限递归,但显然不会。
Recursive constructor invocation Option(Commodity, int)
如何对他说“闭嘴,伙计,我知道我在做什么!”?
毫不奇怪,编译器在这里实际上并没有错误。让我们看看代码的各个部分:
我将假设 和Item
都Consumable
扩展Commodity
.
Item.EMPTY
:我们可以假设这是类型Item
。
c.getClass().cast(c)
: 这没什么作用。它总是有类型的Commodity
。
c.getClass()!=Commodity.class?c.getClass().cast(c):Item.EMPTY
然后将解析为公共超类型。那是Commodity
。
编译器别无选择,只能选择重载Commodity
,这就是它成为递归调用的原因。
总而言之,您要做的就是根据条件调用不同的构造函数重载。这在 Java 中根本不可能。相反,您应该创建一个工厂方法:
static Option create(Commodity commodity, int price) {
return commodity instanceof Consumable ? new Option((Consumable) commodity, price) : new Option(Item.EMPTY, price);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
78 次 |
最近记录: |