if (impl == null || prefereInterfaceMethod(hierarchy, curr, impl)) {
if (impl == null || !JavaModelUtil.isVisibleInHierarchy(impl, type.getPackageFragment()) || prefereInterfaceMethod(hierarchy, curr, impl)) {
	public static IMethod[] getOverridableMethods(IType type, ITypeHierarchy hierarchy, boolean isSubType) throws JavaModelException {		List allMethods= new ArrayList();		IMethod[] typeMethods= type.getMethods();		for (int i= 0; i < typeMethods.length; i++) {			IMethod curr= typeMethods[i];			if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) {				allMethods.add(curr);			}		}		IType[] superTypes= hierarchy.getAllSuperclasses(type);		for (int i= 0; i < superTypes.length; i++) {			IMethod[] methods= superTypes[i].getMethods();			for (int k= 0; k < methods.length; k++) {				IMethod curr= methods[k];				if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) {					if (findMethod(curr, allMethods) == null) {						allMethods.add(curr);					}				}			}		}		IType[] superInterfaces= hierarchy.getAllSuperInterfaces(type);		for (int i= 0; i < superInterfaces.length; i++) {			IMethod[] methods= superInterfaces[i].getMethods();			for (int k= 0; k < methods.length; k++) {				IMethod curr= methods[k];				// binary interfaces can contain static initializers (variable intializations)				// 1G4CKUS				if (!Flags.isStatic(curr.getFlags())) {					IMethod impl= findMethod(curr, allMethods);					if (impl == null || prefereInterfaceMethod(hierarchy, curr, impl)) {						if (impl != null) {							allMethods.remove(impl);						}						// implement an interface method when it does not exist in the hierarchy						// or when it throws less exceptions that the implemented						allMethods.add(curr);					}				}			}		}		if (!isSubType) {			allMethods.removeAll(Arrays.asList(typeMethods));		}		// remove finals		for (int i= allMethods.size() - 1; i >= 0; i--) {			IMethod curr= (IMethod) allMethods.get(i);			if (Flags.isFinal(curr.getFlags())) {				allMethods.remove(i);			}		}		return (IMethod[]) allMethods.toArray(new IMethod[allMethods.size()]);	}