1 package javax.annotation; 2 3 import java.lang.annotation.Documented; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 7 import javax.annotation.meta.TypeQualifier; 8 import javax.annotation.meta.TypeQualifierValidator; 9 import javax.annotation.meta.When; 10 11 /** Used to annotate a value that should only contain nonnegative values */ 12 @Documented 13 @TypeQualifier(applicableTo = Number.class) 14 @Retention(RetentionPolicy.RUNTIME) 15 public @interface Nonnegative { when()16 When when() default When.ALWAYS; 17 18 class Checker implements TypeQualifierValidator<Nonnegative> { 19 forConstantValue(Nonnegative annotation, Object v)20 public When forConstantValue(Nonnegative annotation, Object v) { 21 if (!(v instanceof Number)) 22 return When.NEVER; 23 boolean isNegative; 24 Number value = (Number) v; 25 if (value instanceof Long) 26 isNegative = value.longValue() < 0; 27 else if (value instanceof Double) 28 isNegative = value.doubleValue() < 0; 29 else if (value instanceof Float) 30 isNegative = value.floatValue() < 0; 31 else 32 isNegative = value.intValue() < 0; 33 34 if (isNegative) 35 return When.NEVER; 36 else 37 return When.ALWAYS; 38 39 } 40 } 41 } 42