2

あなたが以下を持っている場合

  1. インターフェイス: 食事
  2. ホットドッグは食事を実装します
  3. バーガーは食事を実装します
  4. サラダ 具材 食事

これらのオブジェクト タイプの 1 つを取り込んで適切なオブジェクトを返すメソッドをどのように作成しますか?

例:

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

私はあなたが反射について言及していると思います。このリンクを見てください 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 に答える
2

私が正しく理解していれば、あなたはこのようなものが欲しいですか?

if(f.getClass().isAssignableFrom(HotDog.class))
   return new HotdogObject();
于 2012-05-18T18:37:33.727 に答える
1

クラスのクラスメソッドを試してください:static Class<?> forName(String class_name)

instanceof 条件に一致するクラスのオブジェクトを返すため。

于 2012-05-18T18:48:35.810 に答える