В §15.12.2.5 Спецификации языка Java они описывают, как Java выбирает наиболее конкретный метод для вызова из списка как доступных, так и применимых методов.
Есть одно конкретное замечание, которое я не понимаю, а именно:
(1) Тип S более конкретен, чем тип T для любого выражения, если S ‹: T
Меня больше всего беспокоит "любое выражение".
Чтобы проиллюстрировать, почему, я процитирую предыдущий абзац, в котором говорится, что, имея два метода m 1 и m 2, мы можем сказать m 1 sub > более конкретен, чем m 2 для вызова с выражениями аргументов e 1, ..., e k если:
m 2 не является универсальным, а m 1 и m 2 применимы при строгом или свободном вызове, и где m 1 sub> имеет формальные типы параметров S 1, ..., S n и m 2 имеет формальные типы параметров T 1 sub>, ..., T n, тип S i более специфичен, чем T i для аргумента e i sub> для всех i (1 ≤ i ≤ n, n = k).
Итак, если тип S i (m 1) более конкретен, чем T i (m 2) с аргументом выражение e i для всех i, тогда m 1 более конкретное, чем m 2
Теперь рассмотрим это:
int a(Number a) { return 1; } // m1
int a(Double a) { return 2; } // m2
Из Double <: Number
следует, что для любого выражения Double
более специфично, чем Number
(из цитаты 1).
У нас есть:
m 1: S 1 => Число
м 2: T 1 => Двойной
Но тогда, если наше выражение аргумента аргумента e 1 имеет тип Number
m 2, это наиболее специфичный метод, поскольку Double
наиболее специфичен для любого выражения ( цитата 1).
Однако, если мы передадим Number
в a()
, результат будет 1
, т.е. метод, принимающий Double
, не выбран. Но в цитате 1 говорится, что если Double
является подтипом Number
, то любое выражение Double
будет более конкретным, так почему же оно выбирает a(Number)
?
Что мне здесь не хватает?
Примечание: я знаю, что Number
не может быть назначен Double
, и компилятору не имеет смысла выбирать другой, я просто пытаюсь понять, что я неправильно интерпретирую с первого раза. Цитировать.
a(Double)
не используется, если вы проходитеNumber
, здесь больше не о чем рассказывать. - person Tom   schedule 23.12.2016Double
,Integer
иnull
(просто черт возьми: D). И, может быть, примитивы тоже. Это может быть интересно. - person Tom   schedule 23.12.2016