2014-10-21 91 views
4

我想編寫一個通用的方法(與仿製藥或PARAM)如何用泛型類型寫一個java方法?

,將取代這兩個調用:

private ServerEvent filterEvents() { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return argument instanceof Type1; 
     } 
    }); 

private ServerEvent filterEvents() { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return argument instanceof Type2; 
     } 
    }); 

我已經試過了,但得到的編譯錯誤:

private <T> ServerEvent filterEvents() { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return argument instanceof T; 
     } 
    }); 

更新:

我也試過這個,但還是收到錯誤:

verify(loggerUtilsWrapper).writeEvent(filterEvents(MatchNotFoundEvent.class)); 


private ServerEvent filterEvents(final Class<MatcherEvent> eventType) { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return argument instanceof eventType; 
     } 
    }); 
} 

回答

4

由於運行時類型擦除,「T」不可用。標準方式是通過Class<T>類型的參數傳遞類型令牌

但是,在這種情況下,您不需要泛型,因爲您實際上並未使用該類型。相反,只是傳遞一個Class對象並進行比較:

private ServerEvent filterEvents(final Class<?> c) { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return c.isInstance(argument); 
     } 
    }); 
5

您應該將Java泛型類型看作編譯器的註釋,而不是可以在代碼中使用的東西,因爲它們不存在於字節碼級別。

如果您需要檢查某個類型,則必須將該類傳遞給該方法。

這應該工作:

private ServerEvent filterEvents(final Class<?> clazz) { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return clazz.isInstance(argument); 
     } 
    }); 

編輯:

Java的instanceof運營商無法比擬對抗類引用的對象。它需要類名。 Class.isInstance()允許你to check instances dynamically

+2

我想你的意思是'clazz.isInstance(argument)'。 「java.lang.Class .instanceOf」方法似乎不存在。 – ApproachingDarknessFish 2014-10-21 22:03:37

+0

我得到「無法解析法‘clazz.instanceOf’ – 2014-10-21 22:05:12

+0

你是對的,謝謝!固定它。 – 2014-10-21 22:06:15

相關問題