Если doSomething
перегружается, необходимо бросить пустой указатель явно к MyClass
, таким образом, правильная перегрузка выбрана:
public void doSomething(MyClass c) {
// ...
}
public void doSomething(MyOtherClass c) {
// ...
}
А не изобрел ситуацию, куда необходимо бросить, когда Вы вызываете varargs функцию:
class Example {
static void test(String code, String... s) {
System.out.println("code: " + code);
if(s == null) {
System.out.println("array is null");
return;
}
for(String str: s) {
if(str != null) {
System.out.println(str);
} else {
System.out.println("element is null");
}
}
System.out.println("---");
}
public static void main(String... args) {
/* the array will contain two elements */
test("numbers", "one", "two");
/* the array will contain zero elements */
test("nothing");
/* the array will be null in test */
test("null-array", (String[])null);
/* first argument of the array is null */
test("one-null-element", (String)null);
/* will produce a warning. passes a null array */
test("warning", null);
}
}
последняя строка произведет соблюдающее предупреждение:
Пример java:26: предупреждение: вызов non-varargs varargs метода с неточным типом аргумента для последнего параметра;
бросок кjava.lang.String
для вызова varargs
бросок кjava.lang.String[]
для non-varargs звонят и подавить это предупреждение
Скажем, Вы имеете эти две функции и предполагаете, что они принимают null
как допустимое значение для вторых параметров.
void ShowMessage(String msg, Control parent);
void ShowMessage(String msg, MyDelegate callBack);
Эти два метода отличаются только типом их вторых параметров. Если Вы хотите использовать одного из них с null
как второй параметр, необходимо бросить null
к типу второго аргумента соответствующей функции, так, чтобы компилятор мог решить который функция звонить.
Для вызывания первой функции: ShowMessage("Test", (Control) null);
Для второго: ShowMessage("Test2", (MyDelegate) null);