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

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

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

mi dà un "Errore di sintassi sul gettone 'estende',, previsto" a "V estende View" per la classe RemoteControl.Generics generici: "Errore di sintassi sul gettone 'estende',, prevede"

Credo che la seguente alternativa era possibile

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

Ancora mi chiedo se questo non può essere fatto in maniera più implicita in quanto quest'ultimo avrebbe richiesto una dichiarazione ridondante della vista. Vale a dire:

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

vs

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

Forse sto solo bloccato in una scatola di nuovo, ma è possibile ottenere i "generici generici" in un modo più elegante

+0

Ho provato a trovare una soluzione, ma penso che tu l'abbia già detto: non può essere fatto nel modo in cui lo vuoi e devi farlo come descritto in seguito. Anche se non sono riuscito a trovare alcun indizio sul tuo problema, ti rimanderò a questo utile sito: http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html – Sentry

+1

Che ne dici di 'public class RemoteControl > '. Dovrebbe davvero importare per un telecomando quale tipo di vista sta usando il controllo che viene controllato da remoto? – SpaceTrucker

+0

Mi sento simpatico per tutte le domande di java generics ... – hbhakhra

risposta

4

vi proponiamo :

Credo che la seguente alternativa era possibile

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

Questa è la soluzione corretta, anche se io normalmente scriverlo come (per migliorare la leggibilità):

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

si sta digitando RemoteControl su un oggetto Control che è anche digitato su un oggetto che extends View. In quanto tale, è necessario fornire l'implementazione di View che digita l'oggetto Control che digita l'oggetto RemoteControl.

Immagino che tu possa interpretare la tua domanda dicendo, perché devo fornire V - non dovrebbe essere implicito dallo <C extends Control<V>>. Al che, la risposta è no , è necessario fornire un tipo per V per assicurare che il giusto tipo di Control è previsto (cioè che extends Control<V>)

Se non ti importa che tipo View l'oggetto Control è digitato su, non è necessario digitare Control nel RemoteControl:

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

Tuttavia, il fatto Control viene digitato sulla V extends View e RemoteControl implements Control<V>, piuttosto suggerisce che si fa ...

Problemi correlati