@Override public boolean isSubtype(AnnotationMirror rhs,AnnotationMirror lhs){
  if (AnnotationUtils.areSameByClass(lhs,UnknownVal.class) || AnnotationUtils.areSameByClass(rhs,BottomVal.class)) {
    return true;
  }
 else   if (AnnotationUtils.areSameByClass(rhs,UnknownVal.class) || AnnotationUtils.areSameByClass(lhs,BottomVal.class)) {
    return false;
  }
 else   if (AnnotationUtils.areSameIgnoringValues(lhs,rhs)) {
    List<Object> lhsValues=AnnotationUtils.getElementValueArray(lhs,"value",Object.class,true);
    List<Object> rhsValues=AnnotationUtils.getElementValueArray(rhs,"value",Object.class,true);
    return lhsValues.containsAll(rhsValues);
  }
 else   if (AnnotationUtils.areSameByClass(lhs,DoubleVal.class) && AnnotationUtils.areSameByClass(rhs,IntVal.class)) {
    List<Long> rhsValues;
    rhsValues=AnnotationUtils.getElementValueArray(rhs,"value",Long.class,true);
    List<Double> lhsValues=AnnotationUtils.getElementValueArray(lhs,"value",Double.class,true);
    boolean same=false;
    for (    Long rhsLong : rhsValues) {
      for (      Double lhsDbl : lhsValues) {
        if (lhsDbl.doubleValue() == rhsLong.doubleValue()) {
          same=true;
          break;
        }
      }
      if (!same) {
        return false;
      }
    }
    return same;
  }
  return false;
}

@ Override public boolean isSubtype ( AnnotationMirror rhs , AnnotationMirror lhs ) { if ( AnnotationUtils . areSameByClass ( lhs , UnknownVal . class ) || AnnotationUtils . areSameByClass ( rhs , BottomVal . class ) ) { return true ; } else if ( AnnotationUtils . areSameByClass ( rhs , UnknownVal . class ) || AnnotationUtils . areSameByClass ( lhs , BottomVal . class ) ) { return false ; } else if ( AnnotationUtils . areSameIgnoringValues ( lhs , rhs ) ) { List < Object > lhsValues = AnnotationUtils . getElementValueArray ( lhs , "value" , Object . class , true ) ; List < Object > rhsValues = AnnotationUtils . getElementValueArray ( rhs , "value" , Object . class , true ) ; return lhsValues . containsAll ( rhsValues ) ; } else if ( AnnotationUtils . areSameByClass ( lhs , DoubleVal . class ) && AnnotationUtils . areSameByClass ( rhs , IntVal . class ) ) { List < Long > rhsValues ; rhsValues = AnnotationUtils . getElementValueArray ( rhs , "value" , Long . class , true ) ; List < Double > lhsValues = AnnotationUtils . getElementValueArray ( lhs , "value" , Double . class , true ) ; boolean same = false ; for ( Long rhsLong : rhsValues ) { for ( Double lhsDbl : lhsValues ) { if ( lhsDbl . doubleValue ( ) == rhsLong . doubleValue ( ) ) { same = true ; break ; } } if ( ! same ) { return false ; } } return same ; } return false ; }
computes subtyping as per the subtyping in the qualifier hierarchy structure unless both annotations are value . in this case , rhs is a subtype of lhs iff lhs contains at least every element of rhs
