因此,如果编译,则意味着 Milk、Bread 和 Meat 是 Food 的子类(它们“扩展”了 Food)。我假设是这种情况。如果是这样,那么这就是编译的原因。
现在,这意味着牛奶、面包和肉类可以被视为食物,但在内部它们是不同的(即一个是面包,一个是牛奶,一个是肉类,每个都有自己独特的成员变量在食物之上物品)
在 Java 中,变量 f 接受任何 Food 和 Food 的任何子类。但是,您传递的任何食物(包括肉类、牛奶和面包)都将被视为 Food 对象,而忽略它们是特定种类的 Food。
如果你想准确地找到它们是什么类型的 Food 子类,你可以使用 instanceof 操作符找出并采取行动。然后,您会将它们转换为它们的实际特定类型,以从这些对象调用特定方法。
您的代码:您正在做的只是返回一个实际的食物项目,因此不需要强制转换。默认情况下,Java 将牛奶、面包和肉类视为食物,默认情况下它们可以代替食物项返回。另一方面,如果您想访问 Meat、Bread 或 Milk 对象的特定属性,那么您将需要强制转换。您需要告诉 java 这些 f 不仅仅是食物,而是肉类、面包或牛奶。例如,如果您的 Milk 类有一个 getFatPercent() 方法,那么您需要执行 ((Milk)f).getFatPercent()
假设可以有更多 Food 的子类,您的代码相当于:
static public Food createMeal(Food f) throws Exception {
if(f instanceof Milk || f instanceof Meat || f instanceof Bread)
return f;
else
throw new Exception("Not a valid Food");
}