2012-09-15 23 views
12

Podczas nadpisywania metody nadklasy, Java zezwala na to, aby typ powrotu był kowariancyjny.Dlaczego sprzeczne typy parametrów w Javie są niedozwolone do przesłonięcia?

Dlaczego są sprzeczne typy parametrów w kontraście nie dozwolone w przypadku nadpisywania metod?

+4

możliwy duplikat [Dlaczego nie ma przeciwwskazań parametrów do przesłonięcia?] (Http://stackoverflow.com/questions/2995926/why-is-there-no-parameter-contra-variance- do-overriding) –

+0

Dzięki. Widziałem to, ale miałem trudności ze zrozumieniem odpowiedzi w C++, ponieważ jestem całkowicie obeznany z C++. Sądzę, że łatwiej będzie konkretnie poprosić o Javę. – Will

+0

Przeczytałem powiązany post i o ile rozumiem, zysk z tej funkcji nie przewyższa zwiększonego współczynnika zaskoczenia. I nie jest trudno dostarczyć przeciążonej metody dla konkretnej implementacji. Mam na myśli jakie inne przypadki użycia dla tej funkcji widzisz? z wyjątkiem bezpośredniego wywoływania metody na klasie? –

Odpowiedz

15

Ponieważ nazywa się to overloading.

W szczególności typ zwracanego typu może być kowariancyjny, ponieważ nie jest brany pod uwagę przy przeciążaniu, a zatem nadal pasuje do implementacji nadklasy lub interfejsu. Parametry są uwzględniane przy przeciążaniu. Bardzo dobrze może być optymalizacja z Number doSomethingWithNumber(Integer value) w porównaniu do Number doSomethingWithNumber(Number value).

+0

Zakładając, że nadal będą obowiązywały inne parametry przeciwwstrząsowe, jakie problemy napotkamy? Szukam czegoś takiego jak: http://stackoverflow.com/a/2996901/715236, jednak co byłoby źle o posiadaniu metody w podklasę nadrzędne wielu w nadklasie? – Will

+0

Największym problemem byłaby niezdolność do zapewnienia przeciążenia, gdy dany typ bazy przeciążyłby gdzieś w łańcuchu. Spowodowałoby to spustoszenie z polimorficznymi wywołaniami funkcji, ponieważ wyszukiwanie musiałoby się zmienić z prostego równego podpisu, na równy lub bardziej podstawowy podpis, i co powinieneś nazwać, jeśli masz oba, ale nazywasz bardziej konkretny? Z perspektywy projektu, jeśli 'A rozszerza B', a' B rozszerza C', ale 'B' zapewnia implementację' void f (Object o) 'z twojego łącza, wtedy' A' nie ma możliwości wprowadzenia więcej specyficzne przeciążone metody. To byłby koszmar. – pickypg

+1

Co najważniejsze, myślę, że doprowadziłoby to do leniwie przesłoniętego API, co skutkowałoby wieloma niesamowicie brzydkimi kodami, które wewnętrznie byłyby używane do wywoływania odpowiedniej metody: 'void f (Object o) {if (o instanceof Integer) f ((Integer) o); } '. A potem musisz zapytać, jak by to działało? Aby zezwolić na zachowanie nadrzędne, oznaczałoby to, że metoda parametru "Object" przesłania metodę parametru "Integer", a zatem powyższy kod spowodowałby nieskończoną pętlę rekursywną (aż do przepełnienia stosu), ponieważ spadłaby z powrotem do '. Metoda obiektu. – pickypg

Powiązane problemy