boolean isApplicable(TypeConfiguration that) {
   List<TypeKind> actuals = that.typeKindList;
   List<TypeKind> formals = parameterTypes.typeKindList;
   if ((actuals.size() - formals.size()) < -1) return false; // not enough args
   for (TypeKind actual : actuals) {
     if (!actual.isSubtypeOf(formals.head)) return false; // type mismatch
     formals = formals.tail.isEmpty() ? formals : formals.tail;
   }
   return true;
 }
 boolean isMoreSpecificThan(VarargsMethod that) {
   return varargsElement.isSubtypeOf(that.varargsElement);
 }
 boolean isApplicable(TypeKind actual, ArgumentsArity argsArity) {
   return argsArity == ArgumentsArity.ZERO || actual.isSubtypeOf(varargsElement);
 }