Kiedy zatrudnić biegle podejście może mieć następujący scenariusz:Java - dziedziczone Płynna typu metoda powrotu do powrotu klasy incydent typ, a nie rodziców
public class Foo<T extends a>{
public Foo<T> someMethod(){
System.out.println("foo");
return this;
}
}
public class Bar<T extends b> extends Foo<T> {
public Bar<T> barMethod(){
System.out.println("bar");
return this;
}
}
public class a{}
public class b extends a{}
Siłą płynny interfejs jest to, że można łańcuch sposób wywołania, ale podczas gdy Bar dziedziczy metodę someMethod(), typ zwracany jest Foo bar, który nie pęknie następujący łańcuch:
new Bar<b>().someMethod().barMethod();
Jedna odpowiedź mogła być dodanie @Overrides dla każdego odziedziczonej metody, takie, że bar ma dodatkowa metoda:
@Override
public Bar<T> someMethod(){
System.out.println("foo");
return this;
}
Ale w dużych klasach i rozbudowanej hierarchii klas może to z pewnością okazać się bałaganem redundancji ?! Czy istnieje odpowiedni typ zwrotu, który zapewnia płynne metody, dzięki którym każda klasa, która go dziedziczy, zwróci obiekt swojego określonego typu (tak abyśmy mogli łączyć metody bez rzutowania)?
Próbowałem:
public <U extends Foo<T>> U someMethod(){
System.out.println("foo");
return this;
}
Do niestety, bezskutecznie. Mam nadzieję, że ktoś wie o prostym i eleganckim rozwiązaniu tego problemu. Projekt jest duży i dlatego musi być w miarę możliwości utrzymywany i rozszerzalny.
Dziękujemy za pomoc w tym scenariuszu.
Ale nadal istnieje "casting", którego OP nie chce. Nie wiem dlaczego. Umm. Ale ten rzut jest lepszy. Jest w jednym miejscu. Tak więc OP powinno być w porządku z tym. Else Lord pomóż mu. ;) –
@RohitJain zobacz komentarz Dokonałem powyższej odpowiedzi: jest to użyteczność, starając się uczynić ją prostą w użyciu, aby klient mógł dołączyć do swojego projektu. Rozwiązanie Marko Topolnika jest jednak interesujące i coś, czego nie brałem pod uwagę. Wydaje się, że odlewy jakiegoś opisu są nieuniknione? – ComethTheNerd
@MarkoTopolnik. Tak, dlatego na końcu mojego komentarza dodałem, że jest to lepszy rzut, jak w jednym miejscu.:) –