Fluent API с наследованием для валидаторов - экземпляр валидатора ввода кажется идентифицированным как родительский класс

Я пишу свободный 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("...");
    }

person Lazysheep.wang    schedule 12.07.2017    source источник


Ответы (1)


На самом деле я нашел решение очень простым.

public <T extends IValidator> T withValidator(T t) throws Exception {
    ...
    return t;
}
person Lazysheep.wang    schedule 12.07.2017