泛型无法将对象强制转换为接口类java

泛型无法将对象强制转换为接口类java,java,generics,Java,Generics,我想使用library来获取实现具有特定注释值的管理器的类 我这样写代码: public enum Reflection { INSTANCE; Reflection() { managersRef = new Reflections("com.company.manager"); } private final Reflections managersRef; public Manager getManagerImplWithNa

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

我这样写代码:

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

怎么了?在inspect中,我可以看到clazz的类型是ProductManager,它实现了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;
}

公共管理器getManagerImplWithName(字符串名称,
Class
代表对象的Class实例告诉您有关Class
Manager
的信息,
Manager
代表管理对象的实例-显然,它们是不同的,不能相互转换。

您没有给我们足够的细节来解决这个问题。
mana是什么gersRef
?声明的方法
GetSubsubfiof
在哪里?我编辑了代码。我认为,您需要一个
Manager
的实例,但您拥有的是一个
Class
对象。正确。我需要一个ManagerI get的实例“类型对象的方法newInstance()未定义”我得到:“类型不匹配:无法从for循环行上的元素类型捕获#2-of?转换为类”调用newInstance时出现这种情况吗?请在调用newInstance之前尝试强制转换对象。@devel
managers
应声明为
Set
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;
}