for (int b= 0; b < m2TypeParameterBounds.length; b++) { if (! equals(m1TypeParameterBounds[b].getErasure(), m2TypeParameterBounds[b].getErasure()))
for (int b= 0; b < m2Bounds.length; b++) { ITypeBinding m1Bound= m1Bounds[b]; if (containsTypeVariables(m1Bound)) m1Bound= m1Bound.getErasure(); else if (m1Bound.isRawType()) m1Bound= m1Bound.getTypeDeclaration(); if (! equals(m1Bound, m1Bounds[b].getErasure()))
	public static boolean isSubsignature(IMethodBinding m1, IMethodBinding m2) {		//TODO: use IMethodBinding#isSubsignature(..) once it is tested and fixed (only erasure of m1's parameter types, considering type variable counts, doing type variable substitution		if (! m1.getName().equals(m2.getName()))			return false;					ITypeBinding[] m1Parameters= m1.getParameterTypes();		ITypeBinding[] m2Parameters= m2.getParameterTypes();		if (m1Parameters.length != m2Parameters.length)			return false;				ITypeBinding[] m1TypeParameters= m1.getTypeParameters();		ITypeBinding[] m2TypeParameters= m2.getTypeParameters();		if (m1TypeParameters.length != m2TypeParameters.length)			return false;				if (m1TypeParameters.length != 0) {			//Note: this branch does not 100% adhere to the spec and may report some false positives.			// Full compliance would require major duplication of compiler code.						//Compare erasures of type parameter bounds:			for (int i= 0; i < m1TypeParameters.length; i++) {				ITypeBinding[] m2TypeParameterBounds= m1TypeParameters[i].getTypeBounds();				ITypeBinding[] m1TypeParameterBounds= m2TypeParameters[i].getTypeBounds();				if (m1TypeParameterBounds.length != m2TypeParameterBounds.length)					return false;				for (int b= 0; b < m2TypeParameterBounds.length; b++) {					if (! equals(m1TypeParameterBounds[b].getErasure(), m2TypeParameterBounds[b].getErasure()))						return false;				}			}			//Compare erasures of parameter types:			for (int i= 0; i < m1Parameters.length; i++) {				if ( ! (equals(m2Parameters[i], m1Parameters[i])						|| equals(m2Parameters[i].getErasure(), m1Parameters[i].getErasure()))) // try to achieve effect of "rename type variables" 					return false;			}			return true;					} else {			for (int i= 0; i < m1Parameters.length; i++) {				if ( ! (equals(m2Parameters[i], m1Parameters[i])						|| equals(m2Parameters[i].getErasure(), m1Parameters[i]))) // subsignature					return false;			}			return true;		}	}