Какая перегрузка будет выбрана для пустого указателя в Java?

Вы могли сделать класс универсальным, если это не делает беспокоит Вас:

    class BaseReturnType { }
    class DerivedReturnType : BaseReturnType { }

    abstract class BaseClass<T> where T : BaseReturnType
    {
        public abstract T PolymorphicMethod();
    }

    class DerivedClass : BaseClass<DerivedReturnType>
    {
        // Error: return type must be 'BaseReturnType' to match 
        // overridden member 'BaseClass.PolymorphicMethod()'
        public override DerivedReturnType PolymorphicMethod()
        {
            return new DerivedReturnType();
        }
    }
52
задан Jean-François Corbett 28 October 2013 в 19:48
поделиться

3 ответа

Будет вызываться наиболее специфический метод - в этом случае

showInputDialog(Component parent, Object message)

Обычно это происходит на этапе «Определить сигнатуру метода» разрешения перегрузки в спецификации (15.12.2), и в частности «Выбор наиболее конкретного метода» .

Не вдаваясь в подробности (которые вы можете прочитать так же хорошо в спецификации, как и здесь), введение дает хорошее резюме:

Если более одного метода члена являются обоими доступный и применимый к методу вызов, необходимо выбрать один, чтобы предоставить дескриптор для отправка метода времени выполнения. Ява язык программирования использует правило что наиболее точным методом является выбран.

Неформальная интуиция такова, что метод более конкретен, чем другой если какой-либо вызов обрабатывается первым метод может быть передан другому один без ошибки типа времени компиляции.

63
ответ дан 7 November 2019 в 09:25
поделиться

В вашем конкретном случае будет вызван более конкретный метод. В целом, однако, в некоторых случаях сигнатура метода может быть неоднозначной. Примите во внимание следующее:

public class Main {

    public static void main(String[] args) {
        Main m = new Main();
        m.testNullArgument(null);
    }

    private void testNullArgument( Object o )
    {
        System.out.println("An Object was passed...");
    }

    private void testNullArgument( Integer i )
    {
        System.out.println("An Integer was passed...");
    }

    private void testNullArgument( String s )
    {
        System.out.println("A String was passed...");
    }
}

В этом случае компилятор не может выбрать между методом, принимающим целое число, и методом, принимающим строку. Когда я пытаюсь его скомпилировать, я получаю

reference to testNullArgument is ambiguous, both method testNullArgument(java.lang.Integer) in testnullargument.Main and method testNullArgument(java.lang.String) in testnullargument.Main match
13
ответ дан 7 November 2019 в 09:25
поделиться

Ни то, ни другое. Вы получите сообщение об ошибке компилятора с просьбой уточнить, какой метод вы хотите вызвать. Вы можете сделать это, явно указав первый аргумент:

showInputDialog((Object) null, "Write something");

или

showInputDialog((Component) null, "Write something");

Update Я должен был знать - никогда не сомневайтесь, Джон Скит. Проблема, о которой я упоминал выше, возникает только тогда, когда невозможно определить, какой метод более конкретен. Вот тестовый пример:

public class Test {

  public void doSomething(String arg1, Object arg2) {
    System.out.println("String, Object");
  }

  public void doSomething(Object arg1, String arg2) {
    System.out.println("Object, String");
  }

  public static void main(String[] args) {
    Test test = new Test();
    test.doSomething(null, null);
  }
}

Вышеупомянутое приведет к ошибке компилятора.

9
ответ дан 7 November 2019 в 09:25
поделиться
Другие вопросы по тегам:

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