gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:30:22 25 4
gpt4 key购买 nike

我的代码如下所示:

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

每次调用 act() 时,都会出于某种原因创建一个新的 Action 实例。我需要子类化 Action 并将其传递给 act()

所以我在工厂方法上使用反射来实现这一点。但这似乎有点矫枉过正而且不安全。

是否可以使用类型安全的方法(例如泛型)来替换反射?

最佳答案

由于类型删除(参见 #1 ),您无法避免反射和 Class<?> arguments 如果你想在运行时实例化一个类型,那么回答你的问题可能有点矫枉过正,但是 new T();这是不可能的。

但是,您可以通过向 Configuration 添加通用类型参数来使其类型安全类。

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

并删除对它的任何原始引用。 (即,将 Configuration 切换为 Configuration<T>,无论它在哪里使用)

关于java - 使用泛型类型创建实例而不是在 java 中进行反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41265394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com