2015-05-25 12 views
6

Diciamo che ho ottenuto le classi A, B, C tali che B si estende A e C si estende anche A.Progettazione di estensione corretta Java per una classe con una raccolta generica

ora ho 2 classi diverse, permette chiamarli MyClassB e MyClassC con un membro del ArrayList<B> e ArrayList<C> respectfuly.

Dal momento che molte azioni in MyClassB e MyClassC sono gli stessi e sono fatto solo sul diverso tipo di ArrayList, ho voluto creare una nuova classe astratta MyClassA che avrà un'implementazione delle stesse azioni su un ArrayList<A> per entrambi classe, poiché A è la parte comune su cui le azioni sono uguali.

Così ho provato a creare un metodo nella nuova classe che riceve un elenco come argomento e si suppone che effettui l'azione su tale elenco. Tuttavia, non posso passare un ArrayList<B> al metodo in cui si aspetta ArrayList<A>.

Quindi cosa posso fare per mantenere le stesse azioni in una classe diversa e non ripetere il codice in 2 classi diverse?

+0

Utilizzare un carattere jolly, come?, Ad es. ArrayList arr = new ArrayList(); – avk

+0

@avk - la covarianza potrebbe essere o non essere richiesta qui. per esempio. sort (ArrayList) – ZhongYu

risposta

3
class MyClassA<T extends A> 
{ 
    ArrayList<T> list; 

    public MyClassA(ArrayList<T> list) 
    { 
     this.list = list; 

... 

class MyClassB extends MyClassA<B> 
{ 
    MyClassB(ArrayList<B> list) 
    { 
     super(list); 
1

Prova con i generici:

public class MyClassA<T extends A> { 
    public void doSomething(ArrayList<T> list) { 
     // do something 
    } 
} 

Ora MyClassB e MyClassC può ereditare da esso e si può lavorare con l'elenco normalmente.

0

vedo due opzioni: Aggiunta di un generico per la classe di base o di lavoro con un carattere jolly:

public final class HolderB extends BaseBase<B>{ 

@Override 
public void abstractAlgo(List<B> elements) { //uses the generic from the base class 
    //add Bs 
    elements.add(new B()); 
    //get Bs 
    System.out.println(elements.get(0)); 
} 

@Override 
public void abstractAlgoWithWildcard(List<? extends Base> elements) { //uses the base class directly 
    //add not possible Bs 
    elements.add(new B()); 
    //get Bs 
    System.out.println(elements.get(0)); 
} 

}

Con la soluzione jolly sua non è possibile aggiungere nuovi elementi alla lista, solo le operazioni di "lettura" sono consentite.

Problemi correlati