I find cast ugly and usually unnecessary. There isn't much code in validateAnnotatable(). I would replace it with:

    protected abstract void collectValidationErrors(Annotatable annotatable, List<Exception> validationErrors);
        

Yes, there would be a very small amount of duplication between the subclasses, but it would be amazingly small:

    protected List<Exception> validate(Annotatable annotatable) {
        List<Exception> validationErrors = new ArrayList<Exception>();
        for (Annotatable annotatable : testClass.getAnnotatedMethods()) {
            validationErrors.addAll(validator.validateAnnotatedMethod(method));
        }
        return validationErrors
    }

... and even smaller for `ClassValidator`

    protected List<Exception> validate(Annotatable annotatable) {
        return validator.validateAnnotatedClass(testClass)
    }

If you want to keep the code largely as-is, you can remove the cast by making `AnnotatableValidator` generic