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

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

Сообщение Anonymous »

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

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

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);
}
}
Я ожидал найти четкую схему расширения -> Упаковка -> Упаковка + Upcasting -> Varargs и т. д..

Вместо этого я столкнулся с очень запутанным поведением.
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
Ответить

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

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

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

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

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