Как Java разрешает неоднозначность перегрузки метода, когда конкурирующие методы имеют параметры с аналогичной иерархиейJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как Java разрешает неоднозначность перегрузки метода, когда конкурирующие методы имеют параметры с аналогичной иерархией

Сообщение Anonymous »

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

Код: Выделить всё

import java.io.*;
public class Main
{

//NOTE: Comparable ties with Serializable and with Number, however Number wins over Serializable

// static void test(Number x) {
//     System.out.println("here in Number x");
// }

// static void test(Serializable x) {
//     System.out.println("here in Serializable x");
// }

// static void test(Comparable x) {
//     System.out.println("here in Comparable x");
// }

public static void main(String[] args) {
test(10);
}
}
Когда test(номер x) закомментирован:

Код: Выделить всё

test(Comparable\ x)
выдает неоднозначную ошибку ссылки, когда он присутствует рядом с test(Serializable x).
Когда test(Serializable x) закомментирован
То же самое происходит с test(Comparable\ x) и test(Number x).
Поэтому я предположил, что все три из них должны интерпретироваться как имеющие одну и ту же иерархию глубина с помощью JVM. Это имеет смысл, поскольку Integer является подклассом Number и реализует Serializable и Comparable.
Однако, когда я закомментирую метод Comparable, тогда Number побеждает Serializable, и вызывается test(Number x)
Проще говоря, я предполагаю, что своего рода транзитивность, при которой, если метод A конфликтует с методом B, а метод A также конфликтует с методом C, то метод B также должен конфликтовать с методом C, но это не так.
Может кто-нибудь объяснить, что здесь происходит?
Для контекста я использовал онлайн-компилятор для проверки кода. Я упоминаю об этом, потому что не уверен, зависит ли такое поведение от реализации JVM.
Изменить: я сталкивался с приоритетом перегрузки метода в Java, но это не отвечает на мой вопрос. В этом материале объясняется, почему одни методы имеют приоритет над другими, но я спрашиваю: почему, когда метод A связан с методами B и C, метод B и метод C не выдают одинаковую ошибку неоднозначности? Возможно, мне здесь не хватает чего-то очень простого.
Изменить 2: я удалил дополнительный вопрос о varargs (как предложил рецензент). Возможно, я задам еще один вопрос по этому поводу.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ods-have-p
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»