Buggy code:
public abstract class TypeBinding extends Binding { public int id = TypeIds . NoId ; public long tagBits = 0 ; public static final BaseTypeBinding INT = new BaseTypeBinding ( TypeIds . T_int , TypeConstants . INT , new char [ ] { 'I' } ) ; public static final BaseTypeBinding BYTE = new BaseTypeBinding ( TypeIds . T_byte , TypeConstants . BYTE , new char [ ] { 'B' } ) ; public static final BaseTypeBinding SHORT = new BaseTypeBinding ( TypeIds . T_short , TypeConstants . SHORT , new char [ ] { 'S' } ) ; public static final BaseTypeBinding CHAR = new BaseTypeBinding ( TypeIds . T_char , TypeConstants . CHAR , new char [ ] { 'C' } ) ; public static final BaseTypeBinding LONG = new BaseTypeBinding ( TypeIds . T_long , TypeConstants . LONG , new char [ ] { 'J' } ) ; public static final BaseTypeBinding FLOAT = new BaseTypeBinding ( TypeIds . T_float , TypeConstants . FLOAT , new char [ ] { 'F' } ) ; public static final BaseTypeBinding DOUBLE = new BaseTypeBinding ( TypeIds . T_double , TypeConstants . DOUBLE , new char [ ] { 'D' } ) ; public static final BaseTypeBinding BOOLEAN = new BaseTypeBinding ( TypeIds . T_boolean , TypeConstants . BOOLEAN , new char [ ] { 'Z' } ) ; public static final BaseTypeBinding NULL = new BaseTypeBinding ( TypeIds . T_null , TypeConstants . NULL , new char [ ] { 'N' } ) ; public static final BaseTypeBinding VOID = new BaseTypeBinding ( TypeIds . T_void , TypeConstants . VOID , new char [ ] { 'V' } ) ; public static final TypeBinding wellKnownType ( Scope scope , int id ) { } public boolean canBeInstantiated ( ) { } public TypeBinding capture ( Scope scope , int position ) { } public void collectSubstitutes ( Scope scope , TypeBinding actualType , InferenceContext inferenceContext , int constraint ) { } public abstract char [ ] constantPoolName ( ) { } public String debugName ( ) { } public int dimensions ( ) { } public ReferenceBinding enclosingType ( ) { } public TypeBinding erasure ( ) { } public ReferenceBinding findSuperTypeErasingTo ( int wellKnownErasureID , boolean erasureIsClass ) { } public TypeBinding findSuperTypeWithSameErasure ( TypeBinding otherType ) { if ( ( this ) == otherType ) return this ; if ( otherType == null ) return null ; switch ( kind ( ) ) { case Binding . ARRAY_TYPE : ArrayBinding arrayType = ( ( ArrayBinding ) ( this ) ) ; int otherDim = otherType . dimensions ( ) ; if ( ( arrayType . dimensions ) != otherDim ) { switch ( otherType . id ) { case TypeIds . T_JavaLangObject : case TypeIds . T_JavaIoSerializable : case TypeIds . T_JavaLangCloneable : return otherType ; } <START_BUG> if ( ( otherDim < ( arrayType . dimensions ) ) & ( ( otherType . leafComponentType ( ) . id ) == ( TypeIds . T_JavaLangObject ) ) ) { <END_BUG> return otherType ; } return null ; } if ( ! ( ( arrayType . leafComponentType ) instanceof ReferenceBinding ) ) return null ; TypeBinding leafSuperType = arrayType . leafComponentType . findSuperTypeWithSameErasure ( otherType . leafComponentType ( ) ) ; if ( leafSuperType == null ) return null ; return arrayType . environment ( ) . createArrayType ( leafSuperType , arrayType . dimensions ) ; case Binding . TYPE_PARAMETER : if ( isCapture ( ) ) { CaptureBinding capture = ( ( CaptureBinding ) ( this ) ) ; TypeBinding captureBound = capture . firstBound ; if ( captureBound instanceof ArrayBinding ) { TypeBinding match = captureBound . findSuperTypeWithSameErasure ( otherType ) ; if ( match != null ) return match ; } } case Binding . TYPE : case Binding . PARAMETERIZED_TYPE : case Binding . GENERIC_TYPE : case Binding . RAW_TYPE : case Binding . WILDCARD_TYPE : if ( ( ! ( otherType . isTypeVariable ( ) ) ) && ( ! ( otherType . isIntersectionType ( ) ) ) ) otherType = otherType . erasure ( ) ; if ( ( ( this ) == otherType ) || ( ( ( ! ( isTypeVariable ( ) ) ) && ( ! ( isIntersectionType ( ) ) ) ) && ( ( erasure ( ) ) == otherType ) ) ) return this ; ReferenceBinding currentType = ( ( ReferenceBinding ) ( this ) ) ; if ( ! ( otherType . isInterface ( ) ) ) { while ( ( currentType = currentType . superclass ( ) ) != null ) { if ( ( currentType == otherType ) || ( ( ( ! ( currentType . isTypeVariable ( ) ) ) && ( ! ( currentType . isIntersectionType ( ) ) ) ) && ( ( currentType . erasure ( ) ) == otherType ) ) ) return currentType ; } return null ; } ReferenceBinding [ ] interfacesToVisit = null ; int nextPosition = 0 ; do { ReferenceBinding [ ] itsInterfaces = currentType . superInterfaces ( ) ; if ( 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 ;

Fix:
if ( ( otherDim < ( arrayType . dimensions ) ) && ( ( otherType . leafComponentType ( ) . id ) == ( TypeIds . T_JavaLangObject ) ) ) {