Код: Выделить всё
import java.io.*;
public class Main
{
// static void test(long x) {
// System.out.println("here in long x");
// }
// static void test(Integer x) {
// System.out.println("here in Integer x");
// }
//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");
// }
// static void test(Object x) {
// System.out.println("here in object x");
// }
//int... varargs ties with Integer... varargs method
//int... varargs also ties with Object... varargs method
//however, Integer... varargs wins over Object... varargs
static void test(int ...x) {
System.out.println("here in int ...x");
}
static void test(Integer ...x) {
System.out.println("here in Integer ...x");
}
static void test(Object ...x) {
System.out.println("here in Object...x");
}
public static void main(String[] args) {
System.out.println("Hello World");
test(10);
}
}
Вместо этого я столкнулся с очень запутанным поведением.
test(Comparable x) выдает неоднозначную ошибку ссылки, когда она присутствует в test(Serializable x)
то же самое и для test(Comparable x) и test(Number x)
Поэтому я как бы предположил, что все три из них должны интерпретироваться JVM как имеющие одинаковую глубину иерархии.
Поскольку Integer подклассы Number и реализуют Serializable и Comparable,
имеет смысл.
Но потом, когда я закомментирую Comparable метод, тогда Number побеждает над Serializable.
И аналогичный случай наблюдается с
test(int ...x)
test(Integer ...x)
test(Object ...x)
как вы можете видеть в приведенном выше коде.
Может кто-нибудь объяснить, что здесь происходит?
К вашему сведению, я использовал онлайн-компилятор для проверки кода. Упоминаю об этом, поскольку я не уверен, специфична ли его реализация JVM.
Изменить: я сталкивался с перегрузкой приоритета метода в Java, но это не отвечает на мой вопрос, поскольку он касается того, почему определенные методы имеют приоритет над другими, но я спрашиваю, почему, когда метод A связан с методом B и C, почему метод B и метод C не выдают одинаковую ошибку двусмысленности. Возможно, я здесь упускаю что-то очень важное.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -and-inter
Мобильная версия