Код: Выделить всё
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(Comparable\ 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
Мобильная версия