2014-04-27 64 views
1

在延續我以前question,我嘗試寫是這樣instanceof似乎不工作 - 我的代碼有什麼問題?

public <T extends LivingThing> T getData(Class<T> clazz, Object otherParam) { 
    if(clazz instanceof Cat) { 
     //do something and return a new Cat 
    } 
} 

我得到一個編譯錯誤「不兼容的條件操作數類型」。如果條件的方法。我究竟做錯了什麼?我如何在我的方法中檢查類的類型?

UPDATE

好吧,我做了一個代碼更改爲使用isAssignableFrom方法。這是一個新問題。

public <T extends LivingThing> List<T> getData(Class<T> classType) { 
     LivingThingEnum livingThing = LivingThingEnum 
       .getLivingThing(classType); 
     if (livingThings.keySet().contains(livingThing)) 
      return livingThings.get(livingThing); 
     return null; 
    } 
private Map<LivingThingEnum,List<? extends LivingThing>> livingThings; 

這給我一個類型不匹配! - 「無法從列表轉換爲列表」。是不是應該擴展LivingThing,那麼在這種情況下,爲什麼編譯器會拋出一個錯誤?

+2

嘗試你應該考慮一個多態接口,其中每個'LivingThing'有一個GetData方法像Cat這樣的類覆蓋。這是一個更清潔的方法。使用'instanceof'是代碼味道。 –

回答

3

您的方法需要Class<T> clazz而不是LivingThing的實例。

要麼改變你的方法:

public <T extends LivingThing> T getData(T livingThing, Object otherParam) { 
    if(livingThing instanceof Cat) { 
     //do something and return a new Cat 
    } 
} 

或使用ClassisAssignableFrom方法與Class測試而不是一個實例:

if(Cat.class.isAssignableFrom(clazz)) 
+0

更新了我的問題。感謝您的回答 – Jay

5

instanceof運營商工作的對象,而不是類。

例如,如果您有變量obj,您可以編寫:obj instanceof Cat。你的情況,你要檢查以下內容:if (Cat.class.isAssignableFrom(clazz))

+0

更新我的問題。感謝您的回答。 – Jay

1

嘗試Class#getName()

public static <T extends LivingThing> T getData(Class<T> clazz, Object otherParam) { 
    if (Cat.class.getName().equals(clazz.getName())) { 
     System.out.println("cat"); 
     // do something and return a new Cat 
    } 
    ... 
} 

Class#equals()

if (Cat.class.equals(clazz)) {..} 
+0

'isAssignableFrom'有問題嗎?比較字符串不僅很亂,而且給出了錯誤的答案 - 「Test」instanceof Object'將返回true - 你的測試不會。 –

+0

@BoristheSpider我編輯了我的帖子。 – Braj