code: public ReferenceType getFirstCommonSuperclass(ReferenceType a, ReferenceType b) throws ClassNotFoundException {
          // Easy case: same types
          if (a.equals(b)) {
              return a;
          }
  
          ReferenceType answer = checkFirstCommonSuperclassQueryCache(a, b);
          if (answer == null) {
              answer = computeFirstCommonSuperclassOfReferenceTypes(a, b);
              putFirstCommonSuperclassQueryCache(a, b, answer);
          }
          return answer;
      }
docs: Get the first common superclass of the given reference types. Note that
  an interface type is never returned unless <code>a</code> and
  <code>b</code> are the same type. Otherwise, we try to return as accurate
  a type as possible. This method is used as the meet operator in
  TypeDataflowAnalysis, and is intended to follow (more or less) the JVM
  bytecode verifier semantics.
  
  <p>
  This method should be used in preference to the
  getFirstCommonSuperclass() method in {@link ReferenceType}.
  </p>
  
  @param a
  a ReferenceType
  @param b
  another ReferenceType
  @return the first common superclass of <code>a</code> and <code>b</code>
  @throws ClassNotFoundException