Angelica Langer mówi w swoim FAQ na temat leków generycznych (patrz Technicalities.FAQ822):Przesłanianie metody rodzajowe przez rodzajowe jeden w Javie
Jeśli te metody mają parametry typu o różnych granicach, potem nie zastępują, ponieważ metody mają podpisy, które nie są równoważne przez nadpisanie. Pamiętaj, że ograniczenia parametrów typu są częścią sygnatury metody ogólnej.
Przykład (ogólnych metod podtypu przeciążenia rodzajowy supertypem metod, nie zaleca się)
class Super { public <T> void set(T arg) { ... } public <T> T get() { ... } } class Sub extends Super { public <S extends Number > void set(S arg) { ... } // overloads public <S extends Number > S get() { ... } // overloads }
nie rozumieć, dlaczego sposób get
jest przeciążone w klasie Sub
. Z tego, co wiem, powinien to być błąd czasu kompilacji, ponieważ get
ma tę samą sygnaturę zarówno w Sub
jak i Super
(typ powrotu nie jest częścią tego).
Co mylą mnie jeszcze bardziej to, że IDE używam do testowania kodu (IntelliJ IDEA 14.0.3) podkreśla get
w Sub
jako błąd kompilacji z Następna wiadomość:
„get () 'in' Sub 'zderza się z' get() 'w' Super '; obie metody mają to samo usunięcie, ale żadna nie zastępuje drugiej.
Ale po uruchomieniu programu kompiluje się i wykonuje bez problemów. Przypuszczam, że jest jakiś błąd w IntelliJ, gdy analizuje kod i co jest poprawne, co Angelica mówi w swoim FAQ. Ale nie mogę tego zrozumieć.
W środowisku Eclipse można ustawić wbudowany kompilator jako bardziej rygorystyczny i traktować określone warunki jako błędy (np. Przypisanie do siebie lub uzyskanie dostępu do metody statycznej za pośrednictwem instancji). Przypuszczam, że to samo można zrobić w IDEA. – biziclop
Problem polega na tym, że parametr typu zastąpionej metody nie ma takich samych ograniczeń jak parametr typu metody z klasy super. –
Jak wspomniano we wpisie, który cytujesz, _ograniczenia parametrów typu są częścią sygnatury metody ogólnej. Tak więc ' T get()' i '
S get()' mają różne podpisy. Zderzenie nazw jest nadal złe, więc w ten sposób plakat mówi, że jest _nie zalecany_ –