在java中使用泛型类型创建实例而不是反射

在java中使用泛型类型创建实例而不是反射,java,reflection,factory-pattern,Java,Reflection,Factory Pattern,我有如下代码: public class Person{ private Configuration configuration; public void act(){ final Action action = new Factory().createAction(configuration); .... } } public class Factory{ public Action createAction(Configura

我有如下代码:

public class Person{
    private Configuration configuration;
    public void act(){
        final Action action = new Factory().createAction(configuration);
        ....
    }
}

public class Factory{
    public Action createAction(Configuration configuration){
        Constructor<? extends Action> constructor =
                  configuration.getActionClass.
                  getConstructor(configuration.getClass());
        return constructor.newInstance(configuration);
    }
}

public class Configuration{
    private Class<? extends Action> actionClass;

    public void setActionClass(Class<? extend Action> cls){
        this.actionClass = cls;
    }

    public Class<? extends Action> getActionClass(){
        return this.actionClass;
    }
}
公共类人物{
私有配置;
公共无效法{
最终动作动作=新建工厂().createAction(配置);
....
}
}
公营工厂{
公共操作createAction(配置){
构造函数由于类型擦除(请参阅),如果要在运行时实例化类型,则无法避免反射和
参数,因此要回答您的问题,这可能有点过分,但
new t();
根本不可能

但是,通过向
配置
类添加泛型类型参数,可以使其类型安全

public class Configuration<T extends Action> {
    private Class<T> actionClass;

    public void setActionClass(Class<T> cls){
        this.actionClass = cls;
    }

    public Class<T> getActionClass(){
        return this.actionClass;
    }
}
公共类配置{
私人类;
公共无效setActionClass(类别cls){
this.actionClass=cls;
}
公共类getActionClass(){
返回此.actionClass;
}
}

并去掉对它的任何原始引用。(即,将
Configuration
切换到
Configuration
,无论它在哪里使用)

我从一位朋友那里得到了一个非常简洁的解决方案,使用了Java 8的新功能特性

public class Person{
    private Configuration configuration;
    public void act(){
        final Action action = configuration.getActionFactory().apply(configuration);
        ....
    }
}

public class Configuration{
    private Function<Configuration, Action> actionFactory = Action::new;

    public void setActionFactory(Function<Configuration, Action> actionFactory){
        this.actionFactory = actionFactory;
    }

    public Function<Configuration, Action> actionFactory getActionFactory(){
        return this.actionFactory;
    }
}
公共类人物{
私有配置;
公共无效法{
最终操作Action=configuration.getActionFactory().apply(配置);
....
}
}
公共类配置{
私有函数actionFactory=Action::new;
公共无效setActionFactory(函数actionFactory){
this.actionFactory=actionFactory;
}
公共函数actionFactory getActionFactory(){
把这个退回工厂;
}
}

如果向配置中添加某种类型(即
配置
类操作类
),则此类型可能会变为类型安全。另请参见此类型也需要更改
公共操作createAction(配置配置)
公共T createAction(配置配置)
,因此它返回参数类型,而不仅仅是
操作
。我的目的不是在运行时更改操作,而是在
操作
@bresai的固定子类中更改此解决方案就可以了。@biziclop当然,这是一个很好的解决方案。但是既然不需要在运行时更改操作,为什么我不能摆脱反射?@bresai是因为这就是Java中实现类型参数的方式。这是一个已知的和计划中的缺陷,在新功能和与前泛型代码的兼容性之间提供了一个很好的折衷。