private List<ApplicableFunction> selectMostSpecificFunctions(List<ApplicableFunction> candidates) { List<ApplicableFunction> representatives = new ArrayList<>(); for (ApplicableFunction current : candidates) { boolean found = false; for (int i = 0; i < representatives.size(); i++) { ApplicableFunction representative = representatives.get(i); if (isMoreSpecificThan(current, representative)) { representatives.set(i, current); } if (isMoreSpecificThan(current, representative) || isMoreSpecificThan(representative, current)) { found = true; break; } } if (!found) { representatives.add(current); } } return representatives; }