@Override
 TypeBinding substituteInferenceVariable(InferenceVariable var, TypeBinding substituteType) {
   if (this.pendingSubstitute != null) return this.pendingSubstitute;
   try {
     TypeBinding substitutedWildcard =
         this.wildcard.substituteInferenceVariable(var, substituteType);
     if (substitutedWildcard != this.wildcard) { // $IDENTITY-COMPARISON$
       CaptureBinding substitute = (CaptureBinding) clone(enclosingType());
       substitute.wildcard = (WildcardBinding) substitutedWildcard;
       this.pendingSubstitute = substitute;
       if (this.lowerBound != null)
         substitute.lowerBound = this.lowerBound.substituteInferenceVariable(var, substituteType);
       if (this.firstBound != null)
         substitute.firstBound = this.firstBound.substituteInferenceVariable(var, substituteType);
       if (this.superclass != null)
         substitute.superclass =
             (ReferenceBinding) this.superclass.substituteInferenceVariable(var, substituteType);
       if (this.superInterfaces != null) {
         int length = this.superInterfaces.length;
         substitute.superInterfaces = new ReferenceBinding[length];
         for (int i = 0; i < length; i++)
           substitute.superInterfaces[i] =
               (ReferenceBinding)
                   this.superInterfaces[i].substituteInferenceVariable(var, substituteType);
       }
       return substitute;
     }
     return this;
   } finally {
     this.pendingSubstitute = null;
   }
 }