【发布时间】:2021-06-15 14:46:56
【问题描述】:
这里是 Java 8,看到关于泛型的莫名编译器错误。
我有RunnableRule:
public interface RunnableRule<INPUT,OUTPUT> {
OUTPUT execute(INPUT input, OUTPUT previousOutput);
}
然后AbstractRuleRunner:
public abstract class AbstractBaseRuleRunner<INPUT,OUTPUT> {
private List<RunnableRule<INPUT,OUTPUT>> rules;
public AbstractBaseRuleRunner(List<RunnableRule<INPUT, OUTPUT>> rules) {
this.rules = rules;
}
protected abstract OUTPUT initOutput();
public OUTPUT runRules(INPUT input) {
OUTPUT output = null;
for (RunnableRule<INPUT,OUTPUT> rule : rules) {
if (output == null) {
output = initOutput();
}
output = rule.execute(input, output);
}
return output;
}
}
然后是一些豆子:
public interface HasPlaintextPassword {
String getPlaintextPassword();
}
@Data
public class SignUpRequest implements HasPlaintextPassword {
@NotNull
private String email;
@NotNull
private String password;
@NotNull
private String appRefId;
private boolean ackTerms;
@Override
public String getPlaintextPassword() {
return getPassword();
}
}
最后是我的规则运行器的具体实现:
public class SignUpValidationRulesRunner extends AbstractBaseRuleRunner<HasPlaintextPassword, ValidationReport> {
public SignUpValidationRulesRunner(List<RunnableRule<HasPlaintextPassword, ValidationReport>> runnableRules) {
super(runnableRules);
}
@Override
protected ValidationReport initOutput() {
return new ValidationReport();
}
}
具体的可运行规则:
public class AcksTermsSignUpRule implements RunnableRule<SignUpRequest, ValidationReport>, RuleConstants {
@Override
public ValidationReport execute(SignUpRequest signUpRequest, ValidationReport previousOutput) {
if (!signUpRequest.isAckTerms()) {
previousOutput.getErrors().add(MUST_ACK_TERMS_ERROR);
}
return previousOutput;
}
}
有些规则会接受SignupRequest 作为输入,因为它们需要使用SignUpRequest 上的某些属性,而有些规则只需要接受HasPlaintextPassword 作为输入,因为它们只是检查密码属性。
最后用胶水把它们粘在一起:
List<RunnableRule<HasPlaintextPassword, ValidationReport>> signUpValidationRules = new ArrayList<>();
AcksTermsSignUpRule acksTermsSignUpRule = new AcksTermsSignUpRule();
signUpValidationRules.add(acksTermsSignUpRule);
这里我在signUpValidationRules.add(acksTermsSignUpRule) 上收到一个编译器错误,指出所需的类型是RunnableRule,但只提供了AcksTermsSignUpRule。
我该怎么做才能让我的规则列表接受HasPlaintextPassword 或SignUpRequest 作为输入通用参数?因为我需要在同一个列表中组合任一输入类型的规则。
【问题讨论】:
-
尝试搜索通配符和
? extends A或? super A语法