泛型不能将Object转换为接口类java

时间:2014-02-16 18:30:36

标签: java generics

我想使用Reflections库来获取实现具有特定注释值的管理器的类。

我写了这样的代码:

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

Manager是一个界面。 SubType是实现Manager的类,例如ProductManager / OfficeManager

我正在寻找使用注释@Service(name = name)来实现它的任何类。

这可以正常工作直到返回(经理)clazz。我明白了:

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

有什么问题?在检查中,我可以看到clazz的类型是实现Manager

的ProductManager

2 个答案:

答案 0 :(得分:1)

您无法将Class对象强制转换为该类的实例。我不确定这是否真的是你想要做的,但你可以从Class对象创建一个实例。

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

答案 1 :(得分:0)

代表对象的Class<Manager>实例告诉你关于Manager,代表管理对象的Manager实例 - 显然,它们不一样并且不能相互投射。