如何解决如何在泛型和继承中使用方法?
具有以下课程:
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
}
错误消息:
在这种情况下,检查文档似乎对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( Config )
是“ 消费者”,是解决“ is not applicable for the arguments (Config)
”错误的一种方法得到的是use a lower bound like I demonstrate here…
…
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“
}
…
这样,您就不需要其他答案提出的强制转换。
我的 loadConfigsFromRepository( )
is implemented like…
static List< ? extends Config > loadConfigsFromRepository(){
return of( new ValidationConf( ),new ProcessConf( ) );
}
,
摆脱通配符。您不需要它。
Step<Config> step = (Step<Config>) conf.type().getDeclaredConstructor().newInstance();
,
您的方法并不完全正确。我建议您在真正需要之前不要使用Reflections
。
请注意,所有这些实现都应隐藏在包内,并且仅Step
接口应为public
。 Config
实现保留了创建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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。