2

如果您有以下情况

  1. 接口:膳食
  2. 热狗工具餐
  3. 汉堡工具餐
  4. 沙拉工具餐

您将如何创建一种方法来接收其中一种对象类型以返回适当的对象?

例子:

Method makeFood(HotDog)

if(HotDog instanceof Meal)
 return new HotdogObject();

你如何正确地做到这一点?

我正在与

static public Food createMeal(Meal f)
      throws Exception
  {

    if (f instanceof Hotdog)
    {
      return f = new HotDog();
    }
    if (f instanceof Burger)
    {
      return f = new Burger();
    }

    throw new Exception("NotAFood!");
  }
4

4 回答 4

4

大多数情况下,您将类与其实例混淆。instanceof顾名思义,操作符验证一个对象是一个类的实例,而不是一个类是另一个类的子类。借助反射可以最优雅地解决您的特定问题:

public static <T extends Meal> T createMeal(Class<T> c) {
  try { return c.newInstance(); }
  catch (Exception e) { throw new RuntimeException(e); }
}

例如,如果你想要一个Burger,你打电话

Burger b = createMeal(Burger.class);

但是,如果您真的只想要另一个与您已经拥有的实例相同类型的实例,那么代码将是

public static Meal createMeal(Meal x) {
  try { return x.getClass().newInstance(); }
  catch (Exception e) { throw new RuntimeException(e); }
}
于 2012-05-18T18:45:33.717 回答
2

如果我理解正确,你想要这样的东西吗?

if(f.getClass().isAssignableFrom(HotDog.class))
   return new HotdogObject();
于 2012-05-18T18:37:33.727 回答
2

我猜你指的是反射。看看这个链接 http://java.sun.com/developer/technicalArticles/ALT/Reflection/

import java.lang.reflect.*;

   public class constructor2 {
      public constructor2()
      {
      }

  public constructor2(int a, int b)
  {
     System.out.println(
       "a = " + a + " b = " + b);
  }

  public static void main(String args[])
  {
     try {
       Class cls = Class.forName("constructor2");
       Class partypes[] = new Class[2];
        partypes[0] = Integer.TYPE;
        partypes[1] = Integer.TYPE;
        Constructor ct 
          = cls.getConstructor(partypes);
        Object arglist[] = new Object[2];
        arglist[0] = new Integer(37);
        arglist[1] = new Integer(47);
        Object retobj = ct.newInstance(arglist);
     }
     catch (Throwable e) {
        System.err.println(e);
     }
  }

}

于 2012-05-18T18:45:54.203 回答
1

试试 Class 的类方法:static Class<?> forName(String class_name)

用于返回与 instanceof 条件匹配的类的对象。

于 2012-05-18T18:48:35.810 回答