// return Int.MAX_VALUE if not applicable // Lower score is better static int methodApplicabilityScore(Method m, O[] args) { Class[] types = m.getParameterTypes(); if (types.length != args.length) ret Int.MAX_VALUE; int score = 0; for (int i = 0; i < types.length; i++) { O a = args[i]; Class c = types[i]; if (a == null) ++score; else if (c == a.getClass()) {} // perfect match else if (isInstanceX(c, a)) ++score; else ret Int.MAX_VALUE; } ret score; }