Я пишу свободный API для проверки пары key:value
на карте. У меня есть иерархия типов валидаторов. Я сослался на один ответ из Fluent API с наследованием и дженериками.
public interface IValidator {
IValidator assertValue(String key, String expectedValue) throws Exception;
abstract class Abstract implements IValidator {
protected final Map<String, String> resultMap = new HashMap<>();
@Override
public <T extends IValidator> T assertValue(String key, String expectedValue) throws Exception {
...
return (T) this;
}
}
Абстрактные подклассы 2-го уровня переопределяют родительский тип следующим образом.
public abstract class AbstractValidator
extends IValidator.Abstract {
// other logic not related to assertion
}
Конкретные подклассы аналогичным образом переопределяют родительский тип.
public class ExampleValidator
extends AbstractValidator
{
public ExampleValidator assertPromptId(String expectedValue) throws Exception{
assertValue(PROMPT_ID, expectedValue);
return this;
}
public ExampleValidator assertNameSpace(String expectedValue ) throws Exception{
assertValue(NAMESPACE, expectedValue);
return this;
}
@Override
public ExampleValidator assertValue(String key, String expectedVlaue) throws Exception {
super.assertValue(key, expectedVlaue);
return this;
}
Теперь мой тестовый пример выглядит следующим образом. Моя проблема в том, что .withValidator(Ivalidator validator)
не смог найти метод assertPromptId()
и assertNameSpace()
, а только assertValue()
. Итак, как это исправить?
public class AssertionContext {
public <T extends IValidator> T withValidator(IValidator validator) throws Exception {
return (T) validator;
}
}
// test method in main
public void invocationTest() throws Throwable {
AssertionContext verify = new AssertionContext();
verify.withValidator(new ExampleValidator()).assertNameSpace("...");
}