Вызов перегруженного метода

Прошу помочь. Почему в данном случае вызывается метод с аргументом String?

class TestClass {
public static void method(Object o){
    System.out.println("In Object");
}
public static void method(String s){
    System.out.println("In String");
}

public static void main(String[] args) {
    method(null);
}
}

А здесь же например вообще ошибка компиляции происходит.

class TestClass {
public static void method(Integer o){
    System.out.println("In Integer");
}
public static void method(StringBuilder s){
    System.out.println("In StringBuilder");
}

public static void main(String[] args) {
    method(null);
}
}

Почему в первом случае компиляцию проходит и выполняется метод с аргументом String, а в другом случае ошибка компиляции при вызове с параметром null?


Ответы (1 шт):

Автор решения: Fleckinger

Java всегда будет пытаться использовать наиболее конкретную версию метода. В первом случае не возникает ошибки, так как Object является суперклассом класса String, а следовательно метод принимающий String является более конкретной версией, и java может определить какой из методов использовать. В втором же случае, Integer и StringBuilder более конкретны чем Object однако не более конкретны чем каждый из них, так как оба объекта наследуются от Object, и java не может определить какому из методов передать null. В данном случае вам нужно явно привести тип

method((Integer)null);

Подробнее можете почитать на сайте оракла https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5

→ Ссылка