2013-02-19 16 views
7
public interface View{... 

public interface Control<V extends View>{... 

public class RemoteControl<C extends Control<V extends View>> implements Control<V>{... 

daje mi „błąd składni na żeton«rozciąga»oczekuje” na „V rozciąga się widok” dla klasy RemoteControl.generyczne Leki generyczne: „Błąd składni na żeton«rozciąga»oczekuje”

Chyba następujące alternatywą było możliwe

public class RemoteControl<C extends Control<V>,V extends View> implements Control<V> 
{... 

Wciąż zastanawiam się, czy nie można tego zrobić w sposób niejawny więcej ponieważ ten ostatni wymaga nadmiarowego deklarację View. Tj:

public class TVRemoteControl extends RemoteControl<TVControl,TvView> implements TVControl{... 

vs

public class TVRemoteControl extends RemoteControl<TVControl> implements TVControl{... 

Może jestem po prostu utknął w polu znowu, ale jest to możliwe, aby uzyskać „Generics rodzajowe” w bardziej elegancki sposób

+0

Próbowałem wymyślić rozwiązanie, ale myślę, że już to powiedziałeś: Nie można tego zrobić tak, jak tego chcesz i musisz to zrobić tak, jak opisałeś później. Mimo że nie znalazłem tutaj żadnych wskazówek, odniosę się do tej pomocnej strony: http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html – Sentry

+1

Co powiesz na "public class RemoteControl > '. Czy w przypadku zdalnej kontroli ważne jest, jaki rodzaj widoku steruje się zdalnie za pomocą pilota? – SpaceTrucker

+0

Czuję sympatię dla wszystkich pytań generycznych java ... – hbhakhra

Odpowiedz

4

proponujesz :

Chyba następujące alternatywą było możliwe

public class RemoteControl<C extends Control<V>,V extends View> implements Control<V>{} 

Jest to poprawne rozwiązanie, chociaż chciałbym normalnie napisać go jako (dla czytelności):

public class RemoteControl<V extends View, C extends Control<V>> implements Control<V>{} 

wpisywania RemoteControl na Control obiektu, który jest również wpisany na obiekcie tym extends View. W związku z tym należy podać implementację View, która powoduje typ obiektu Control, który powoduje typ obiektu RemoteControl.

Zgaduję, że możesz zinterpretować swoje pytanie, mówiąc: dlaczego mam podać V - nie powinno to być dorozumiane z <C extends Control<V>>. Do którego odpowiedź jest nie, musisz podać typ dla V aby zapewnić odpowiedni rodzaj Control jest (to znaczy, że extends Control<V>)

Jeśli nie obchodzi, jaki rodzaj View przedmiotem Control jest wpisana na, nie trzeba wpisywać Control w RemoteControl:

public class RemoteControl<C extends Control> implements Control{} 

Jednakże fakt Control jest wpisany na V extends View i RemoteControl implements Control<V>, raczej sugeruje, że robisz ...

Powiązane problemy