2014-02-16 95 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代表经理对象的实例 - 显然,他们是不一样的,不能被铸造成彼此。

相关问题