Как разрешается неоднозначность при выборе из перегруженных методов в Java? - PullRequest
18 голосов
/ 09 апреля 2010
package org.study.algos;
public class Study {

    public static void main(String[] args) {
       A a = new A();
       a.m1(null);
    }
 }
 class A {
    public void m1(String s) {
       System.out.println("String");
        System.out.println(s);
    }
    public void m1(Object obj) {
       System.out.println("Object");
       System.out.println(obj);
    }
}

Здесь вывод

Строка нуль

Почему JVM разрешает метод в метод с аргументом String?

Заранее спасибо J * +1010 *

Ответы [ 5 ]

16 голосов
/ 09 апреля 2010

Это довольно сложный алгоритм, описанный в JLS 15.12 . Но здесь важна часть 15.12.2 , которая гласит: «выбрана самая конкретная». Перегрузки Object и String являются «доступными и применимыми» (String применима, поскольку нулевой литерал является ссылкой всех типов), а String является более конкретным.

РЕДАКТИРОВАТЬ: Исправленный раздел, в соответствии с синтаксическим.

10 голосов
/ 09 апреля 2010

Эти методы «перегружены», а не «неоднозначны».

Согласно Спецификация языка Java :

Когда метод вызывается (§15.12), количество фактических аргументов (и любой явные аргументы типа) и типы времени компиляции аргументов используются во время компиляции, чтобы определить сигнатуру метода это будет вызвано (§15.12.2).

И в §15.12.2 говорится:

Может быть несколько таких метод, в этом случае большинство конкретный выбран.

String более специфичен, чем Object, поэтому, хотя null совместим с обоими, выбран метод с параметром String (существуют гораздо более сложные правила, которые применяются, когда типы параметров являются частью класс или интерфейсная иерархия).

2 голосов
/ 09 апреля 2010

Нулевое значение может быть установлено на ссылку любого типа. Все ваши перегруженные методы находятся в одной иерархии наследования Object <- String, наименее общий из которых выбирается. Но если бы у вас было два перегруженных метода, которые не находятся в одной иерархии, вы получите ошибку компиляции с неоднозначными методами. </p>

0 голосов
/ 09 апреля 2010

Я задал похожий вопрос. Джон Скит написал большой ответ.

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

0 голосов
/ 09 апреля 2010

String - это Object, Object - не String, поэтому первая перегрузка более специфична , чем вторая. См. JLS 15.12.2 , как указано в Синтаксическом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...