Почему пустой указатель бросил параметр? [дубликат]

Этот вопрос уже имеет ответ здесь:

Когда и почему был бы кто-то делать следующее:

doSomething( (MyClass) null );

Вы когда-либо делали это? Вы могли обменяться своим опытом?

81
задан pek 29 September 2019 в 00:34
поделиться

2 ответа

Если 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 звонят и подавить это предупреждение

128
ответ дан Johannes Schaub - litb 24 November 2019 в 09:35
поделиться

Скажем, Вы имеете эти две функции и предполагаете, что они принимают null как допустимое значение для вторых параметров.

void ShowMessage(String msg, Control parent);
void ShowMessage(String msg, MyDelegate callBack);

Эти два метода отличаются только типом их вторых параметров. Если Вы хотите использовать одного из них с null как второй параметр, необходимо бросить null к типу второго аргумента соответствующей функции, так, чтобы компилятор мог решить который функция звонить.

Для вызывания первой функции: ShowMessage("Test", (Control) null);
Для второго: ShowMessage("Test2", (MyDelegate) null);

34
ответ дан wchargin 24 November 2019 в 09:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: