Пожалуйста, будьте точны, поскольку ваши наблюдения находятся в прямом противоречии с принятым ответом здесь . , кажется, не скован. не очень точен, либо есть, либо нет.
javax.validation.constraints.@NotNull
- это проверка JSR, поэтому она должна охватываться вышеуказанным ответом. Если нет, возможно, вы можете попытаться прокомментировать этот ответ.
Я бы посоветовал опубликовать вашу программу / настройку драйвера, так как сомневаюсь, что валидатор bean-компонента jsr может не вызываться в ваших экземплярах.
Вы должны понимать, что это конкретное поведение, перечисленное в ответе выше, очень специфично для процессоров аннотаций проверки бобов & amp; не имеет ничего общего с общим наследованием аннотаций в Java.
Просто не по теме, но пытаюсь включить эти ответы, чтобы понять Наследование аннотаций в Java,
Ответ -4 Spring MVC Validations
Просто для иллюстрации, нет сообщений об ошибках до строки - Bar bar = foo.getBar();
, но когда я провожу его через валидатор, я получаю сообщение - bar- may not be null
для обоих родителей & amp; ребенок,
@java.lang.FunctionalInterface
public interface FooChild extends Foo {
}
и программа водителя,
import java.util.Set;
import javax.validation.Configuration;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
public class DriverProgram {
public static void main(String[] args) {
Foo foo = () -> {
return null;
};
Bar bar = foo.getBar();
Configuration> config = Validation.byDefaultProvider().configure();
ValidatorFactory factory = config.buildValidatorFactory();
Validator validator = factory.getValidator();
factory.close();
Set> violations = validator.validate(foo);
violations.forEach(v -> System.out.println(v.getPropertyPath() + "- " + v.getMessage()));
FooChild fooChild = () -> {
return null;
};
bar = fooChild.getBar();
violations = validator.validate(fooChild);
violations.forEach(v -> System.out.println(v.getPropertyPath() + "- " + v.getMessage()));
}
}
Это зависит от типа аргумента, соглашения о вызовах вызванной функции, archtecture и компилятора. На x86 Паскаль соглашение о вызовах оценивает аргументы слева направо, тогда как в соглашении о вызовах C ( __ cdecl) это справа налево. Большинство программ, которые работают на нескольких платформах, действительно принимает во внимание соглашения о вызовах пропустить неожиданности.
существует хорошее статья о Raymond Chen' блог, если Вам интересно. Можно также хотеть смотреть на раздел Stack и Calling руководства GCC.
Редактирование: , Пока мы крохоборствуем: Мой ответ рассматривает это не как вопрос о языке, но как платформа один. Стандарт языка не делает gurantee или предпочитает один по другой и оставляет его как [1 110] неуказанным . Отметьте формулировку. Это не говорит, что это не определено. Неуказанный в этом смысле означает что-то, на что Вы не можете рассчитывать, непортативное поведение. У меня нет спецификации/проекта C удобной, но это должно быть подобно этому из моего проекта n2798 (C++)
Certain, другие аспекты и операции абстрактной машины описаны в этом Международном стандарте как неуказанные (например, порядок оценки аргументов функции). Где возможно, этот Международный стандарт определяет ряд допустимых поведений. Они определяют недетерминированные аспекты абстрактной машины. Экземпляр абстрактной машины может таким образом иметь больше чем одну возможную последовательность выполнения для данной программы и данного входа.
Это не точная копия Вашего вопроса, но мой ответ (и немногие другие) покрывают Ваш вопрос также.
существуют очень хорошие причины оптимизации, почему компилятор не мог бы просто выбрать справа налево, но также и чередовать их.
стандарт даже не гарантирует последовательного упорядочивания. Это только гарантии, что, когда функция вызвана, все аргументы были полностью оценены.
И да, я видел, что несколько версий GCC делают точно это. Для Вашего примера назвали бы нечто (0,0), и я буду 2 впоследствии. (Я не могу дать Вам точный номер версии компилятора. Это было только что - но я не буду удивлен видеть, что это поведение открывается снова. Это - эффективный способ запланировать инструкции)
В прошлый раз, когда я видел, различия были между VS2005 и GCC 3.x на x86 аппаратных средствах в 2007. Таким образом, это (был?) вероятная ситуация. Таким образом, я никогда не полагаюсь на порядок оценки больше. Возможно, это лучше теперь.
Я ожидаю, что самые современные компиляторы попытались бы чередовать инструкции, вычислив аргументы, учитывая, что они требуются стандартом C++ быть независимыми и таким образом испытать недостаток в любых взаимозависимостях. Выполнение этого должно помочь сохранить модули выполнения глубоко конвейерного ЦП полными и таким образом увеличить пропускную способность. (По крайней мере, я ожидал бы, что компилятор, который утверждает, что был оптимизирующим компилятором, сделал бы так, когда флаги оптимизации даны.)