2009-06-07 16 views
5

ho le seguenti classi ha installato:Java Generics, Generics estese e classi astratte

public abstract class Process<T,S> { 
    ... 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    protected S processer; 
    ... 
} 

public class ProcessImpl<EventType1, EventType2> { 
    ... 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 
    processer = new ProcesserImpl(); 
    ... 
} 

Tutto va bene fino a ottenere al ResourceImpl. Mi è stato detto che ProcessImpl non è un sostituto valido per il parametro limitato <S extends Process<T,S>> del tipo Resource<T,S>.

Ho provato vari modi per aggirare questo e continuare a colpire un muro.

Qualcuno ha qualche idea?

risposta

11
public class ProcessImpl<EventType1, EventType2> { 
... 
} 

Perché ProcessImpl non estende processo. ProcessImpl non è derivato da Process, che è ciò che stai dichiarando che il parametro dovrebbe essere.

0

Non riesco a vedere un modo per modificare la versione originale, o commentare le risposte fornite senza un rappresentante migliore.

Questo codice esisterà su un livello Web, l'eventtype2 è definito sul livello di persistenza e accessibile solo nel livello core che esiste al di sotto di questo livello.

Quindi, sfortunatamente, senza un accoppiamento stretto, che vorrei evitare, non ho accesso a EventType2.

+0

Non capisco. Non sei in grado di estendere ProcessImpl da Process? –

1

Si potrebbe desiderare di fare qualcosa di simile:

public abstract class Process<T, S> { 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    S processor; 

} 

public class ProcessImpl extends Process<EventType1, ProcessImpl> { 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 

} 

Se si vincola il parametro S del Resource di essere un processore è inoltre necessario dichiarare correttamente sulla classe ProcessImpl. Non so cosa sia EventType2 ma dovrebbe implementare l'interfaccia di processo. Ho dato per scontato che tu voglia dire lo ProcessImpl.

0

Se non si desidera che il codice dipenda da un pacchetto esistente, che contiene lo Process, è possibile introdurre anche un nuovo pacchetto di interfaccia in base a nulla nella parte inferiore della gerarchia di classi. (Se sei in grado di modificare i vincoli dell'eredità, naturalmente.)