微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在泛型和继承中使用方法?

如何解决如何在泛型和继承中使用方法?

具有以下课程:

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?扩展Config)的方法 步骤不适用于 参数(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( 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接口应为publicConfig实现保留了创建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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?