我有以下代码。这为什么有效?铸造是否必要?
static public Food createMeal(Food f)
throws Exception
{
if (f instanceof Bread)
{
return (Bread) f;
}
else if (f instanceof Meat)
{
return (Meat) f;
}
else if (f instanceof Milk)
{
return (Milk) f;
}
throw new Exception("NotAFood!");
}
答案 0 :(得分:4)
不,贬低者是不必要的,实际上是无操作:
instanceof
检查确保向下转换不会失败; Food
语句向上转发回return
。该功能可以更紧凑地编写:
static public Food createMeal(Food f) throws Exception {
if ((f instanceof Bread) || (f instanceof Meat) || (f instanceof Milk)) {
return f;
} else {
throw new Exception("NotAFood!");
}
}
话虽如此,在条件语句中使用instanceof
通常是糟糕设计的标志。想象一下,添加Food
的新子类。现在,您必须重新访问代码中以这种方式使用instanceof
的每个位置,并对其进行适当修改。
更好的设计是在基类中定义合适的虚函数,并在派生类中重写它。
答案 1 :(得分:3)
您在这里不需要else
,因为如果满足以前的条件,那么return
只会逃避整个方法:
if (f instanceof Bread)
{
return (Bread) f;
}
if (f instanceof Meat)
{
return (Meat) f;
}
if (f instanceof Milk)
{
return (Milk) f;
}
throw new Exception("NotAFood!");
不,这里没有必要进行向下转型。实际上你可以编写这样的等效函数:
static public Food createMeal(Food f) throws Exception {
if(f instanceof Bread || f instanceof Meat || f instanceof Milk) {
return f;
}
throw new Exception("NotAFood!");
}
答案 2 :(得分:1)
因此,如果编译,则意味着牛奶,面包和肉类是食物的子类(它们“延伸”食物)。我会假设情况就是这样。如果是这样,那就是编译的原因。
现在,这意味着牛奶,面包和肉类可以被视为食物,但在内部深处它们是不同的(即一个是面包,一个是牛奶,一个是肉,每个都有自己独特的成员变量食品项目)
在Java中,变量f接受任何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");
}
答案 3 :(得分:0)
没有必要进行施法。不,如果你不想要别的话。事实上,其他人总是可选的
答案 4 :(得分:-1)
请注意,else
语句始终不是可选的。例如,下面的代码无法编译,因为没有else
语句!编译器会感到困惑,因为check()方法必须返回boolean
并认为在某些情况下if
和else-if
语句均无法执行,因此check()会永不返回boolean
:
static boolean check(int x) {
if (x < 5) {
return true;
} else if (x >= 5) {
return false;
}
}
public static void main(String[] args) {
check(5);
}