Java如何使用instanceof返回新的对象类型?

时间:2012-05-18 18:35:00

标签: java oop instanceof

如果您有以下

  1. 界面:用餐
  2. Hotdog实施用餐
  3. 汉堡实施用餐
  4. 沙拉实施用餐
  5. 如何创建一个方法来接受其中一个对象类型以返回相应的对象?

    示例:

    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 个答案:

答案 0 :(得分: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); }
}

答案 1 :(得分:2)

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

if(f.getClass().isAssignableFrom(HotDog.class))
   return new HotdogObject();

答案 2 :(得分: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);
     }
  }

}

答案 3 :(得分:1)

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

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