if (a.isArray() && b.isArray()) { ArrayType aArrayType = (ArrayType) a; ArrayType bArrayType = (ArrayType) b;  Type aElementType = aArrayType.getElementType(this); Type bElementType = bArrayType.getElementType(this);  if (aElementType.isReferenceType() && bElementType.isReferenceType()) { ObjectType aElementObjectType = (ObjectType) aElementType; ObjectType bElementObjectType = (ObjectType) bElementType;  ObjectType mergedElementType = getFirstCommonSuperclass(aElementObjectType, bElementObjectType); return arrayTypeFromElementType(mergedElementType); }  return classTypeFromSignature(JAVA_LANG_OBJECT_SIGNATURE); }
	public ObjectType getFirstCommonSuperclass(ObjectType a, ObjectType b) throws ClassNotFoundException {		if (DEBUG) System.out.println("Get first common superclass for " + a + " and " + b);		// Easy case		if (a.equals(b))			return a;		if (a.isArray() && b.isArray()) {			ArrayType aArrayType = (ArrayType) a;			ArrayType bArrayType = (ArrayType) b;			Type aElementType = aArrayType.getElementType(this);			Type bElementType = bArrayType.getElementType(this);			if (aElementType.isReferenceType() && bElementType.isReferenceType()) {				ObjectType aElementObjectType = (ObjectType) aElementType;				ObjectType bElementObjectType = (ObjectType) bElementType;				ObjectType mergedElementType =					getFirstCommonSuperclass(aElementObjectType, bElementObjectType);				return arrayTypeFromElementType(mergedElementType);			}			return classTypeFromSignature(JAVA_LANG_OBJECT_SIGNATURE);		}		// FIXME:		// This algorithm could easily be extended to find the set		// of common unrelated supertypes.  Just keep iterating		// adding common supertypes to the set.  When a common		// supertype is found, eliminate its supertypes from		// consideration (since they would be not be "least" supertypes).		// For now, we just use the stupid JVM bytecode verifier		// algorithm that loses all sorts of information.		SubtypeQueryResult cachedResultForA = findSupertypes(a);		SubtypeQueryResult cachedResultForB = findSupertypes(b);		for (Iterator<ObjectType> i = cachedResultForB.supertypeInBFSOrderIterator(); i.hasNext(); ) {			ObjectType bSuper = i.next();			if (DEBUG) System.out.print("  ....considering " + bSuper);			if (bSuper.isInterface()) {				// FIXME: stupid loss of information				if (DEBUG) System.out.println(": INTERFACE, no");				continue;			}			boolean isSuper = cachedResultForA.isSupertype(bSuper);			if (DEBUG) System.out.println(": " + isSuper);			if (isSuper) {				return bSuper;			}		}		// This should not be possible		throw new IllegalStateException("Failed to find a common supertype: " +			" for object types " + a.getSignature() + " and " + b.getSignature() + ": impossible");	}