Java 如何将方法与泛型和继承一起使用?
具有以下类别:Java 如何将方法与泛型和继承一起使用?,java,generics,reflection,Java,Generics,Reflection,具有以下类别: public interface Step<C extends Config> { void setConfig(C config); } 及 及 及 及 及 因此,应用程序需要动态实例化Step子类对象,相应地设置配置并运行该步骤,如下所示 List<Config> configs = loadConfigsFromRepository(); // contain all subtypes of Config for (Config conf: c
public interface Step<C extends Config> {
void setConfig(C config);
}
及
及
及
及
及
因此,应用程序需要动态实例化Step子类对象,相应地设置配置并运行该步骤,如下所示
List<Config> configs = loadConfigsFromRepository(); // contain all subtypes of Config
for (Config conf: configs) {
Step<? extends Config> step = conf.type().getDeclaredConstructor().newInstance();
step.setConfig(conf); // compiler complains
}
错误消息:
的方法setConfigcapture8?扩展类型中的配置 步骤不适用于 参数配置 查看文档,在这种情况下,Java看起来不友好: 克服此代码限制步骤的可能解决方案有哪些。setConfigconf 编辑[解决方案]
代码可在此处查看:您的方法不完全正确。我建议你在真正需要之前不要使用反射 请注意,所有这些实现都应该隐藏在包中,并且只有Step接口应该是公共的。配置实现保存了创建步骤类所需的所有数据,所以只需将其委托给该类即可
package steps
public interface Step<C extends Config> {
void run(Context context);
}
private final class ValidationStep implements Step<ValidationConf> {
private final ValidationConf config;
public ValidationStep(ValidationConf config) {
this.config = config;
}
}
private class ProcessStep implements Step<ProcessConf> {
private final ProcessConf config;
public ValidationStep(ProcessConf config) {
this.config = config;
}
}
public interface Config {
Step<? extends Config> createStep();
}
private class ValidationConf implements Config {
public Step<ValidationConf> createStep() {
return new ValidationStep(this);
}
}
private class ProcessConf implements Config {
public Step<ValidationConf> createStep() {
return new ProcessConf(this);
}
}
package foo
List<Config> configs = loadConfigsFromRepository();
for (Config config : loadConfigsFromRepository()) {
config.createStep().run(context);
}
你的方法不完全正确。我建议你在真正需要之前不要使用反射 请注意,所有这些实现都应该隐藏在包中,并且只有Step接口应该是公共的。配置实现保存了创建步骤类所需的所有数据,所以只需将其委托给该类即可
package steps
public interface Step<C extends Config> {
void run(Context context);
}
private final class ValidationStep implements Step<ValidationConf> {
private final ValidationConf config;
public ValidationStep(ValidationConf config) {
this.config = config;
}
}
private class ProcessStep implements Step<ProcessConf> {
private final ProcessConf config;
public ValidationStep(ProcessConf config) {
this.config = config;
}
}
public interface Config {
Step<? extends Config> createStep();
}
private class ValidationConf implements Config {
public Step<ValidationConf> createStep() {
return new ValidationStep(this);
}
}
private class ProcessConf implements Config {
public Step<ValidationConf> createStep() {
return new ProcessConf(this);
}
}
package foo
List<Config> configs = loadConfigsFromRepository();
for (Config config : loadConfigsFromRepository()) {
config.createStep().run(context);
}
去掉通配符。你不需要它
Step<Config> step = (Step<Config>) conf.type().getDeclaredConstructor().newInstance();
去掉通配符。你不需要它
Step<Config> step = (Step<Config>) conf.type().getDeclaredConstructor().newInstance();
由于Step.setConfig是一个“使用者”,解决“不适用于参数配置”错误的一种方法是
由于Step.setConfig是一个“使用者”,解决“不适用于参数配置”错误的一种方法是
编译器抱怨的确切含义是什么?错误消息是什么?类型步骤中扩展配置的方法setConfigcapture8不适用于参数ConfigWhat is Context in Step.runContext ctx?它神奇地再次出现在for循环中:“Step.runContext”“。它是如何实现的?你没有说清楚。另外,你定义了一个泛型类:”“Step
您是否已将其标记为已接受?为什么这三个你都不能接受?TIA.Hi@dedupler-我想说这两种解决方案都令人满意,工作正常。我同意您的解决方案在我看来可能更优雅一些,避免了强制转换,但两者都只是合成糖。如果我这样做,我得到:类型不匹配:无法从的capture8转换?将步骤扩展到步骤“I get:类型不匹配:无法从的capture8转换?”?将步骤扩展到步骤Yep。我试过了,效果很好。谢谢真棒的丹尼尔斯特罗!我很高兴能帮助你。最近,@Nikolas的一个回答刚刚被接受并被投票通过。这个答案与我几个小时前向你们提出的答案基本相同。你同意还是不同意我的回答比你问题的其他两个答案更容易接受?如果你不同意,那么请让我知道:为了让你将我的答案标记为已接受,我的答案如何改进?为什么这三个你都不能接受?TIA.Hi@dedupler-我想说这两种解决方案都令人满意,工作正常。我同意你的解决方案在我看来可能更优雅一点,避免铸造,但两者都只是合成糖。
List<Config> configs = loadConfigsFromRepository(); // contain all subtypes of Config
for (Config conf: configs) {
Step<? extends Config> step = conf.type().getDeclaredConstructor().newInstance();
step.setConfig(conf); // compiler complains
}
package steps
public interface Step<C extends Config> {
void run(Context context);
}
private final class ValidationStep implements Step<ValidationConf> {
private final ValidationConf config;
public ValidationStep(ValidationConf config) {
this.config = config;
}
}
private class ProcessStep implements Step<ProcessConf> {
private final ProcessConf config;
public ValidationStep(ProcessConf config) {
this.config = config;
}
}
public interface Config {
Step<? extends Config> createStep();
}
private class ValidationConf implements Config {
public Step<ValidationConf> createStep() {
return new ValidationStep(this);
}
}
private class ProcessConf implements Config {
public Step<ValidationConf> createStep() {
return new ProcessConf(this);
}
}
package foo
List<Config> configs = loadConfigsFromRepository();
for (Config config : loadConfigsFromRepository()) {
config.createStep().run(context);
}
Step<Config> step = (Step<Config>) conf.type().getDeclaredConstructor().newInstance();
…
List< ? extends Config > configs = loadConfigsFromRepository( ); // contain all subtypes of Config
for ( Config conf: configs ) {
Step< ? super Config > step = conf.type( ).getDeclaredConstructor( ).newInstance( );
step.setConfig( conf ); // *set* makes Step a „consumer“
}
…
static List< ? extends Config > loadConfigsFromRepository(){
return of( new ValidationConf( ), new ProcessConf( ) );
}