public ReferenceBinding findSuperTypeOriginatingFrom(int wellKnownOriginalID,boolean originalIsClass){
  if (!(this instanceof ReferenceBinding))   return null;
  ReferenceBinding reference=(ReferenceBinding)this;
  if (reference.id == wellKnownOriginalID || (original().id == wellKnownOriginalID))   return reference;
  ReferenceBinding currentType=reference;
  if (originalIsClass) {
    while ((currentType=currentType.superclass()) != null) {
      if (currentType.id == wellKnownOriginalID)       return currentType;
      if (currentType.original().id == wellKnownOriginalID)       return currentType;
    }
    return null;
  }
  ReferenceBinding[] interfacesToVisit=null;
  int nextPosition=0;
  do {
    ReferenceBinding[] itsInterfaces=currentType.superInterfaces();
    if (itsInterfaces != null && itsInterfaces != Binding.NO_SUPERINTERFACES) {
      if (interfacesToVisit == null) {
        interfacesToVisit=itsInterfaces;
        nextPosition=interfacesToVisit.length;
      }
 else {
        int itsLength=itsInterfaces.length;
        if (nextPosition + itsLength >= interfacesToVisit.length)         System.arraycopy(interfacesToVisit,0,interfacesToVisit=new ReferenceBinding[nextPosition + itsLength + 5],0,nextPosition);
        nextInterface:         for (int a=0; a < itsLength; a++) {
          ReferenceBinding next=itsInterfaces[a];
          for (int b=0; b < nextPosition; b++)           if (next == interfacesToVisit[b])           continue nextInterface;
          interfacesToVisit[nextPosition++]=next;
        }
      }
    }
  }
 while ((currentType=currentType.superclass()) != null);
  for (int i=0; i < nextPosition; i++) {
    currentType=interfacesToVisit[i];
    if (currentType.id == wellKnownOriginalID)     return currentType;
    if (currentType.original().id == wellKnownOriginalID)     return currentType;
    ReferenceBinding[] itsInterfaces=currentType.superInterfaces();
    if (itsInterfaces != null && itsInterfaces != Binding.NO_SUPERINTERFACES) {
      int itsLength=itsInterfaces.length;
      if (nextPosition + itsLength >= interfacesToVisit.length)       System.arraycopy(interfacesToVisit,0,interfacesToVisit=new ReferenceBinding[nextPosition + itsLength + 5],0,nextPosition);
      nextInterface:       for (int a=0; a < itsLength; a++) {
        ReferenceBinding next=itsInterfaces[a];
        for (int b=0; b < nextPosition; b++)         if (next == interfacesToVisit[b])         continue nextInterface;
        interfacesToVisit[nextPosition++]=next;
      }
    }
  }
  return null;
}

public ReferenceBinding findSuperTypeOriginatingFrom ( int wellKnownOriginalID , boolean originalIsClass ) { if ( ! ( this instanceof ReferenceBinding ) ) return null ; ReferenceBinding reference = ( ReferenceBinding ) this ; if ( reference . id == wellKnownOriginalID || ( original ( ) . id == wellKnownOriginalID ) ) return reference ; ReferenceBinding currentType = reference ; if ( originalIsClass ) { while ( ( currentType = currentType . superclass ( ) ) != null ) { if ( currentType . id == wellKnownOriginalID ) return currentType ; if ( currentType . original ( ) . id == wellKnownOriginalID ) return currentType ; } return null ; } ReferenceBinding [ ] interfacesToVisit = null ; int nextPosition = 0 ; do { ReferenceBinding [ ] itsInterfaces = currentType . superInterfaces ( ) ; if ( itsInterfaces != null && itsInterfaces != Binding . NO_SUPERINTERFACES ) { if ( interfacesToVisit == null ) { interfacesToVisit = itsInterfaces ; nextPosition = interfacesToVisit . length ; } else { int itsLength = itsInterfaces . length ; if ( nextPosition + itsLength >= interfacesToVisit . length ) System . arraycopy ( interfacesToVisit , 0 , interfacesToVisit = new ReferenceBinding [ nextPosition + itsLength + 5 ] , 0 , nextPosition ) ; nextInterface : for ( int a = 0 ; a < itsLength ; a ++ ) { ReferenceBinding next = itsInterfaces [ a ] ; for ( int b = 0 ; b < nextPosition ; b ++ ) if ( next == interfacesToVisit [ b ] ) continue nextInterface ; interfacesToVisit [ nextPosition ++ ] = next ; } } } } while ( ( currentType = currentType . superclass ( ) ) != null ) ; for ( int i = 0 ; i < nextPosition ; i ++ ) { currentType = interfacesToVisit [ i ] ; if ( currentType . id == wellKnownOriginalID ) return currentType ; if ( currentType . original ( ) . id == wellKnownOriginalID ) return currentType ; ReferenceBinding [ ] itsInterfaces = currentType . superInterfaces ( ) ; if ( itsInterfaces != null && itsInterfaces != Binding . NO_SUPERINTERFACES ) { int itsLength = itsInterfaces . length ; if ( nextPosition + itsLength >= interfacesToVisit . length ) System . arraycopy ( interfacesToVisit , 0 , interfacesToVisit = new ReferenceBinding [ nextPosition + itsLength + 5 ] , 0 , nextPosition ) ; nextInterface : for ( int a = 0 ; a < itsLength ; a ++ ) { ReferenceBinding next = itsInterfaces [ a ] ; for ( int b = 0 ; b < nextPosition ; b ++ ) if ( next == interfacesToVisit [ b ] ) continue nextInterface ; interfacesToVisit [ nextPosition ++ ] = next ; } } } return null ; }
find supertype which originates from a given well - known type , or null if not found ( using id avoids triggering the load of well - known type : 73740 ) note : only works for erasures of well - known types , as random other types may share same id though being distincts .
