code: public ObjectType getFirstCommonSuperclass(ObjectType a, ObjectType b) throws ClassNotFoundException {
          // Easy case
          if (a.equals(b)) {
              return a;
          }
  
          ObjectType firstCommonSupertype = (ObjectType) checkFirstCommonSuperclassQueryCache(a, b);
          if (firstCommonSupertype == null) {
              firstCommonSupertype = computeFirstCommonSuperclassOfObjectTypes(a, b);
              firstCommonSuperclassQueryCache.put(a, b, firstCommonSupertype);
          }
  
          return firstCommonSupertype;
      }
docs: Get the first common superclass of the given object 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
  an ObjectType
  @param b
  another ObjectType
  @return the first common superclass of <code>a</code> and <code>b</code>
  @throws ClassNotFoundException