Ответ 1
Я даю ответ в соответствии с этим:
Проблема заключается в том, как найти вызовы методов, подобные этому, где первый метод должен быть вызван (и был до того, как мы изменили наш код генератор), но вызывается вторая.
Во-первых, как уже было указано, компилятор Java дает предупреждения об использовании такого метода. Это выглядит так:
com/stack/undsprlbl/varargs/Main.java: 10: предупреждение: вызов без varargs varargs метод с неточным аргументом типа для последнего параметра;
и может быть легко grep
-ed от javac
вывода.
Во-вторых, вы можете подумать о написании некоторого самотестирования для своего кода в следующих строках:
Class cl = Ambiguity.class;
Method[] methods = cl.getDeclaredMethods();
Set<String> varargsMethods = new HashSet<String>();
for (Method method : methods) {
Class c[] = method.getParameterTypes();
if(c.length > 0)
{
Class last = c[c.length - 1];
if(last.isArray())
{
if(varargsMethods.contains(method.getName()))
System.out.println("Method " + cl.getName() + "#"+ method.getName() + " looks suspicious.");
else
varargsMethods.add(method.getName());
}
}
}
с пониманием, что вы должны перебирать все свои классы вместо прямого упоминания. Этот ответ кажется способ пойти - возьмите все пакеты в приложении и проверьте их.
На этом этапе у вас будет два списка:
-
Список способов использования двусмысленных методов varargs
-
Список двусмысленных методов varargs.
Скрещивая эти два, вы можете выяснить, где вы, вероятно, будете иметь проблемы.
Далее я бы предложил проверить версию кода до того, как был добавлен второй метод, и найти все способы использования первого. Это явно необходимо устранить в пользу первого метода в версии HEAD. Таким образом, я полагаю, оставалось бы довольно конечное число этих вызовов.