package javax.annotation; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import javax.annotation.meta.TypeQualifier; import javax.annotation.meta.TypeQualifierValidator; import javax.annotation.meta.When; /** Used to annotate a value that should only contain nonnegative values */ @Documented @TypeQualifier(applicableTo = Number.class) @Retention(RetentionPolicy.RUNTIME) public @interface Nonnegative { When when() default When.ALWAYS; class Checker implements TypeQualifierValidator { public When forConstantValue(Nonnegative annotation, Object v) { if (!(v instanceof Number)) return When.NEVER; boolean isNegative; Number value = (Number) v; if (value instanceof Long) isNegative = value.longValue() < 0; else if (value instanceof Double) isNegative = value.doubleValue() < 0; else if (value instanceof Float) isNegative = value.floatValue() < 0; else isNegative = value.intValue() < 0; if (isNegative) return When.NEVER; else return When.ALWAYS; } } }