Buggy code:
if ( ! ( isAcceptableMethod ( tiebreakMethod , acceptable ) ) ) continue nextVisible ; if ( ( current . isBridge ( ) ) && ( ! ( next . isBridge ( ) ) ) ) if ( tiebreakMethod . areParametersEqual ( acceptable ) ) continue nextVisible ; } moreSpecific [ i ] = current ; count ++ ; } } if ( count == 1 ) { for ( int i = 0 ; i < visibleSize ; i ++ ) { if ( ( moreSpecific [ i ] ) != null ) { compilationUnitScope ( ) . recordTypeReferences ( visible [ i ] . thrownExceptions ) ; return visible [ i ] ; } } } else if ( count == 0 ) { return new ProblemMethodBinding ( visible [ 0 ] , visible [ 0 ] . selector , visible [ 0 ] . parameters , ProblemReasons . Ambiguous ) ; } if ( receiverType != null ) receiverType = ( receiverType instanceof CaptureBinding ) ? receiverType : ( ( ReferenceBinding ) ( receiverType . erasure ( ) ) ) ; nextSpecific : for ( int i = 0 ; i < visibleSize ; i ++ ) { MethodBinding current = moreSpecific [ i ] ; if ( current != null ) { ReferenceBinding [ ] mostSpecificExceptions = null ; MethodBinding original = current . original ( ) ; boolean shouldIntersectExceptions = ( original . declaringClass . isAbstract ( ) ) && ( ( original . thrownExceptions ) != ( Binding . NO_EXCEPTIONS ) ) ; for ( int j = 0 ; j < visibleSize ; j ++ ) { MethodBinding next = moreSpecific [ j ] ; if ( ( next == null ) || ( i == j ) ) continue ; MethodBinding original2 = next . original ( ) ; if ( ( original . declaringClass ) == ( original2 . declaringClass ) ) break nextSpecific ; if ( ! ( original . isAbstract ( ) ) ) { if ( original2 . isAbstract ( ) ) continue ; original2 = original . findOriginalInheritedMethod ( original2 ) ; if ( original2 == null ) continue nextSpecific ; if ( ( current . hasSubstitutedParameters ( ) ) || ( ( original . typeVariables ) != ( Binding . NO_TYPE_VARIABLES ) ) ) { if ( ! ( environment ( ) . methodVerifier ( ) . isParameterSubsignature ( original , original2 ) ) ) continue nextSpecific ; } } else if ( receiverType != null ) { TypeBinding superType = receiverType . findSuperTypeOriginatingFrom ( original . declaringClass . erasure ( ) ) ; if ( ( ( original . declaringClass ) == superType ) || ( ! ( superType instanceof ReferenceBinding ) ) ) { } else { MethodBinding [ ] superMethods = ( ( ReferenceBinding ) ( superType ) ) . getMethods ( original . selector , argumentTypes . length ) ; for ( int m = 0 , l = superMethods . length ; m < l ; m ++ ) { if ( ( superMethods [ m ] . original ( ) ) == original ) { original = superMethods [ m ] ; break ; } } } superType = receiverType . findSuperTypeOriginatingFrom ( original2 . declaringClass . erasure ( ) ) ; if ( ( ( original2 . declaringClass ) == superType ) || ( ! ( superType instanceof ReferenceBinding ) ) ) { } else { MethodBinding [ ] superMethods = ( ( ReferenceBinding ) ( superType ) ) . getMethods ( original2 . selector , argumentTypes . length ) ; for ( int m = 0 , l = superMethods . length ; m < l ; m ++ ) { if ( ( superMethods [ m ] . original ( ) ) == original2 ) { original2 = superMethods [ m ] ; break ; } } } if ( ( original . typeVariables ) != ( Binding . NO_TYPE_VARIABLES ) ) original2 = original . computeSubstitutedMethod ( original2 , environment ( ) ) ; if ( ( original2 == null ) || ( ! ( original . areParameterErasuresEqual ( original2 ) ) ) ) continue nextSpecific ; if ( ( original . returnType ) != ( original2 . returnType ) ) { <START_BUG> if ( current instanceof ParameterizedGenericMethodBinding ) { <END_BUG> if ( ( original . returnType . erasure ( ) . findSuperTypeOriginatingFrom ( original2 . returnType . erasure ( ) ) ) == null ) continue nextSpecific ; } else if ( ! ( current . returnType . isCompatibleWith ( next . returnType ) ) ) { continue nextSpecific ; } } if ( shouldIntersectExceptions && ( original2 . declaringClass . isInterface ( ) ) ) { if ( ( current . thrownExceptions ) != ( next . thrownExceptions ) ) { if ( ( next . thrownExceptions ) == ( Binding . NO_EXCEPTIONS ) ) { mostSpecificExceptions = Binding . NO_EXCEPTIONS ; } else { if ( mostSpecificExceptions == null ) { mostSpecificExceptions = current . thrownExceptions ; } int mostSpecificLength = mostSpecificExceptions . length ; int nextLength = next . thrownExceptions . length ; SimpleSet temp = new SimpleSet ( mostSpecificLength ) ; boolean changed = false ; nextException : for ( int t = 0 ; t < mostSpecificLength ; t ++ ) { ReferenceBinding exception = mostSpecificExceptions [ t ] ; for ( int s = 0 ; s < nextLength ; s ++ ) { ReferenceBinding nextException = next . thrownExceptions [ s ] ; if ( exception . isCompatibleWith ( nextException ) ) { temp . add ( exception ) ; continue nextException ; } else if ( nextException . isCompatibleWith ( exception ) ) { temp . add ( nextException ) ; changed = true ; continue nextException ; } else { changed = true ; } }

Fix:
if ( ( next . original ( ) . typeVariables ) != ( Binding . NO_TYPE_VARIABLES ) ) {