@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; } }