【发布时间】:2021-01-03 14:49:21
【问题描述】:
有以下类:
public interface Step<C extends Config> {
void setConfig(C config);
}
和
public class ValidationStep implements Step<ValidationConf> {
public void setConfig(ValidationConf conf) {}
// implementation
}
和
public class ProcessStep implements Step<ProcessConf> {
public void setConfig(ProcessConf conf) {}
// implementation
}
和
public interface Config {
Class<? extends Step> type();
}
和
public class ValidationConf implements Config {
public Class<? extends Step> type() {
return ValidationStep.class;
}
}
和
public class ProcessConf implements Config {
public Class<? extends Step> type() {
return ProcessStep.class;
}
}
因此,应用程序需要动态实例化 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
}
错误信息:
"类型中的方法setConfig(capture#8-of ? extends Config) 步骤
不适用于 参数(配置)”。
检查文档,在这种情况下,Java 似乎不友好: https://docs.oracle.com/javase/tutorial/java/generics/wildcardGuidelines.html
有哪些可能的解决方案来克服此代码限制step.setConfig(conf);?
已编辑 [解决方案]
代码可以在这里查看:https://github.com/danieldestro/cucumber-salad/tree/generics/src/main/java/my/generics
【问题讨论】:
-
“编译器抱怨”到底是什么意思?错误信息是什么?
-
"Step
类型中的方法 setConfig(capture#8-of ? extends Config) 不适用于参数 (Config)" -
Step.run(Context ctx)中的Context是什么?它神奇地再次出现在您的for循环中:“step.run(context)”。它是如何到达那里的?你没有说清楚。 -
另外,您定义了一个通用类:„
Step< C extends Config >“。但随后在Config中指定使用它的方法,以使用原始类型:“Class<? extends Step> type();”。这是为什么?与问题无关? -
„...这与这里的问题无关...“ - 在这种情况下,您是否考虑将其从问题中删除?
标签: java generics reflection