Java你还需要别的吗?另外,你需要投一个扩展课吗?

时间:2012-05-18 14:42:50

标签: java casting if-statement

我有以下代码。这为什么有效?铸造是否必要?

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!");
  }

5 个答案:

答案 0 :(得分:4)

不,贬低者是不必要的,实际上是无操作:

  1. instanceof检查确保向下转换不会失败;
  2. 每个向下转发引用都会立即通过Food语句向上转发回return
  3. 该功能可以更紧凑地编写:

      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并认为在某些情况下ifelse-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);
}