code: public static float getTypeDifferenceWeight(Class<?>[] paramTypes, Object[] destArgs) {
          if (paramTypes.length != destArgs.length) {
              return Float.MAX_VALUE;
          }
  
          float weight = 0.0f;
          for (int i = 0; i < paramTypes.length; i++) {
              Class<?> srcClass = paramTypes[i];
              Object destArg = destArgs[i];
              weight += getTypeDifferenceWeight(srcClass, destArg);
              if (weight == Float.MAX_VALUE) {
                  break;
              }
          }
          return weight;
      }
docs: Algorithm that judges the match between the declared parameter types of
  a candidate method and a specific list of arguments that this method is
  supposed to be invoked with.
  
  @param paramTypes the parameter types to match
  @param destArgs the arguments to match
  @return the accumulated weight for all arguments