编译器认为使用 arg.getClass().cast(arg) 调用构造函数是递归的,尽管这是错误的

-4 java compiler-errors class

我有一个接口,它是和枚举Commodity的超类型。另外,还有一个具有多个构造函数的类:ItemConsumableOption

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)

如何对他说“闭嘴,伙计,我知道我在做什么!”?

Jor*_*orn 6

毫不奇怪,编译器在这里实际上并没有错误。让我们看看代码的各个部分:

我将假设 和ItemConsumable扩展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)