dlaczego program wywołuje foo(String x)
zamiast foo(Object x)
To dlatego String
klasa rozciąga się od Object
i stąd jest bardziej charakterystyczne dla Object
. Tak więc kompilator decyduje się na wywołanie tej metody. Pamiętaj, że kompilator zawsze wybiera najbardziej specyficzną metodę wywołania. Zobacz Section 15.12.5 of JLS
Jeśli więcej niż jedna metoda jest członkiem zarówno dostępne i stosowane do wywołania metody, konieczne jest, aby wybrać jedną z wytworzeniem deskryptor dla metody wysyłki run-time. Język programowania Java wykorzystuje regułę, że wybrana jest najbardziej szczegółowa metoda.
Nieformalną intuicją jest to, że jedna metoda jest bardziej szczegółowa niż inna, jeśli jakakolwiek inwokacja obsługiwana przez pierwszą metodę może zostać przekazana do drugiej bez błędu typu kompilacji.
Jednakże, jeśli masz dwie metody z parametrem - String
i Integer
, wtedy dostanie ambiguity
błąd na null
, jak kompilator nie może zdecydować, który z nich jest bardziej specyficzne, ponieważ są one non-kowariantna typy.
Czy przeciążenia nie zostały statycznie rozwiązane przy użyciu typu kompilacji wyrażenia? –
'foo (null)' nazywa metodę klasy wyższej –
@GrijeshChauhan Jaka klasa wyższa. Pytanie nie wspomina o hierarchii klasowej. – millimoose