Вызов перегруженного метода
Прошу помочь. Почему в данном случае вызывается метод с аргументом 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 шт):
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