Неоднозначный вызов метода println char array и String (вместо Object) - PullRequest
0 голосов
/ 08 ноября 2019
public class Task03<K> {
        public <T> T foo() {
            try {
                return (T) new Integer(42);
            } catch (ClassCastException e) {
                return (T) new Integer(43);
            }
        }
        public static void main(String[] args) {
            Task03<?> v = new Task03<>();
            System.out.println(v.foo());
        }
}

У меня ошибка компиляции в строке System.out.println(v.foo()); Неоднозначный вызов метода: совпадения как println (char []), так и println (String)

Мне не понятно, почему java пытается использоватьэто 2 метода вместо println(Object) или println(int)

Как мы можем понять это поведение компилятора Java?

Спасибо

1 Ответ

0 голосов
/ 08 ноября 2019

Java выбирает наиболее конкретно применимый метод. Поскольку <T> определяется на месте вызова, может быть выбран любой из PrintStream.println методов, которые принимают параметр ссылочного типа.

Из JLS 15.12.2.5 :

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

Все, что вы можете передать println(char[]) или println(String), также можно передать println(Object), поэтому первые методы более специфичны, чем последние. Таким образом, они будут выбраны в предпочтении println(Object).

Однако некоторые вещи, которые могут быть переданы в println(char[]), не могут быть переданы в println(String), поэтому ни один из них не является более конкретным, чем другойотсюда и неоднозначный вызов метода.

...