2014-02-16 100 views
1

我認爲要使用Reflections庫來獲取實現具有特定註釋值的管理器的類。泛型不能將對象轉換爲接口類java

我寫了這樣的代碼:

public enum Reflection { 

    INSTANCE; 

    Reflection() { 
     managersRef = new Reflections("com.company.manager"); 
    } 

    private final Reflections managersRef; 

    public Manager getManagerImplWithName(String name, Class<? extends Manager> subType) { 
      Set<?> managers = managersRef.getSubTypesOf(subType); 
      for (Object clazz : managers) { 
       Service serviceAnno = ((Class<?>) clazz).getAnnotation(Service.class); 
       if (serviceAnno != null && !StringUtils.isEmpty(serviceAnno.name()) && serviceAnno.name().equals(name)) 
        return (Manager) clazz; 
      } 
      return null; 
     } 
} 

管理器是一個接口。 SubType是實現Manager的類,例如ProductManager/OfficeManager

我正在尋找任何使用註釋@Service(name = name)實現它的類。

這工作正常,直到線返回(經理)clazz。我得到:

java.lang.ClassCastException: java.lang.Class cannot be cast to com.mycompany.manager.Manager 

什麼問題?在檢查中,我可以看到clazz的類型是ProductManager,它實現了管理器

+0

你沒有給我們足夠的細節來解決這個問題。什麼是'managersRef'? 「getSubTypeOf」方法在哪裏聲明? –

+0

我編輯了代碼。思考是https://code.google.com/p/reflections/ – Dejell

+0

我相信,你想要一個'Manager'的實例,但是你擁有的是一個'Class'對象。 – qqilihq

回答

1

您不能將Class對象轉換爲該類的實例。我不確定這真的是你想要做的,但你可以從Class對象創建一個實例。的Class<Manager>

public Manager getManagerImplWithName(String name, Class<? extends Manager> subType) { 
    Set<?> managers = managersRef.getSubTypesOf(subType); 
    for (Object clazz : managers) { 
     Service serviceAnno = ((Class<?>) clazz).getAnnotation(Service.class); 
     if (serviceAnno != null && !StringUtils.isEmpty(serviceAnno.name()) && serviceAnno.name().equals(name)) 
      return (Manager) ((Class<?>) clazz).newInstance(); 
    } 
    return null; 
} 
+0

我得到了「方法newInstance()未定義類型對象」 – Dejell

+0

我得到:「類型不匹配:無法從for循環行上的元素類型捕獲#2-of轉換爲類」 – Dejell

+0

當你調用newInstance時你會得到這個嗎? –

0

實例表示對象,告訴你一些關於ManagerManager代表經理對象的實例 - 顯然,他們是不一樣的,不能被鑄造成彼此。

相關問題