2012-05-18 24 views
2

,如果你有以下Java你將如何使用instanceof返回一個新的對象類型?

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

這是功課嗎?你試過什麼了? – templatetypedef

+0

沒有作業 - 我試過了:看看編輯 – stackoverflow

+1

除非'Hotdog'和'Burger'擴展/實現'Food',否則這個例子不會編譯。 – Jeffrey

回答

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); } 
} 
+0

這將是什麼適當的方法。儘管它似乎是我發佈的問題的答案,但我不認爲反思是我想要的。我想知道如何做到這一點正確的OOP方式 – stackoverflow

+0

你想要第一種方式,通過'class'文字指定對象類型嗎?在那種情況下,真的沒有辦法。如果你提供一個已經存在的實例,那麼正確的OOP方式應該是'Meal'有一個用於這個目的的方法,比如'anotherInstance',並且每個類都會相應地實現它。如果你已經有了你的類型的實例,多態只能工作。 –

2

工作如果我理解正確的話,你要這樣呢?

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

哦,我明白了,感謝您的編輯。 –

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

}

1

嘗試一下類的類方法:static Class<?> forName(String class_name)

返回匹配instanceof的條件的類的對象。

相關問題