Какую версию Java вы используете? С 1.6.0_11 код (вставленный ниже) компилируется и запускается.
Я уверен, что очевидно, почему foo(testVal)
переходит к foo(Object)
.
Причина, по которой foo(null)
переходит к foo(String)
, немного сложна. Константа null
имеет тип nulltype
, который является подтипом всех типов. Итак, это nulltype
расширяет String
, что расширяет Object
.
При вызове foo(null)
компилятор ищет перегруженный метод с наиболее конкретным типом. Поскольку String
является более конкретным, чем Object
, это метод, который вызывается.
Если бы у вас была другая перегрузка, которая была бы такой же специфичной, как String, скажем, foo(Integer)
, то вы получите неоднозначную ошибку перегрузки.
class NullType {
public static final void main(final String[] args) {
foo();
}
static void foo()
{
Object testVal = null;
foo(testVal); // dispatched to foo(Object)
foo(null); // compilation problem -> "The method foo(String) is ambiguous"
}
public static void foo(String arg) { // More-specific
System.out.println("foo(String)");
}
public static void foo(Object arg) { // Generic
System.out.println("foo(Object)");
}
}