if (!overridableTypes[index].getErasure().isSubTypeCompatible(overriddenTypes[index].getErasure()))
final ITypeBinding overridableErasure= overridableTypes[index].getErasure(); final ITypeBinding overriddenErasure= overriddenTypes[index].getErasure(); if (!overridableErasure.isSubTypeCompatible(overriddenErasure) || !overridableErasure.getKey().equals(overriddenErasure.getKey()))
	private static boolean areSubTypeCompatible(IMethodBinding overridden, IMethodBinding overridable) {				if (overridden.getParameterTypes().length != overridable.getParameterTypes().length)			return false;				ITypeBinding overriddenReturn= overridden.getReturnType();		ITypeBinding overridableReturn= overridable.getReturnType();		if (overriddenReturn == null || overridableReturn == null)			return false;				if (!overriddenReturn.getErasure().isSubTypeCompatible(overridableReturn.getErasure()))			return false;				ITypeBinding[] overriddenTypes= overridden.getParameterTypes();		ITypeBinding[] overridableTypes= overridable.getParameterTypes();		Assert.isTrue(overriddenTypes.length == overridableTypes.length);		for (int index= 0; index < overriddenTypes.length; index++) {			if (!overridableTypes[index].getErasure().isSubTypeCompatible(overriddenTypes[index].getErasure()))				return false;		}		ITypeBinding[] overriddenExceptions= overridden.getExceptionTypes();		ITypeBinding[] overridableExceptions= overridable.getExceptionTypes();		boolean checked= false;		for (int index= 0; index < overriddenExceptions.length; index++) {			checked= false;			for (int offset= 0; offset < overridableExceptions.length; offset++) {				if (overriddenExceptions[index].isSubTypeCompatible(overridableExceptions[offset]))					checked= true;			}			if (!checked)				return false;		}		return true;	}