Domanda

Ho cercato di estendere la classe ArrayList senza molto successo. Io voglio estenderlo, e essere in grado di parametrizzare esso.

Quindi, normalmente si ha qualcosa come

ArrayList<SomeObject> list = new ArrayList<SomeObject>();

Voglio

MyList<SomeObject> list = new MyList<SomeObject>();

È sufficiente che si estende ArrayList non funziona.

public class MyList extends ArrayList ...

Il quando cerco di usarlo ottengo l'errore

  

Il tipo MyList non è generica; esso   non può essere parametrizzato con argomenti   

Ho provato varianti di

public class MyList extends ArrayList<Object>
public class MyList<SubObject> extends ArrayList<Object>

senza successo, Se uso il sotto-oggetto dietro il nome della classe sembra funzionare, ma nasconde i metodi nella classe sotto-oggetto per qualche motivo.

Ogni pensiero o suggerimenti su come ottenere questo diritto di lavoro sono apprezzati.

È stato utile?

Soluzione

È necessario specificare un tipo di parametro di tipo 's il ArrayList. Per parametri di tipo generico, T è abbastanza comune. Dal momento che il compilatore non sanno cosa sia un MyList è, è necessario aggiungere un parametro di tipo a List che può avere il tipo di passato in questo modo, si ottiene:.

public class MyList<T> extends ArrayList<T>

Inoltre, si può prendere in considerazione l'attuazione <=> e delegando a un <=>, piuttosto che eredita da <=>. "Favorire la composizione di oggetti oltre la classe eredità. [ Design Patterns pag. 20]"

Altri suggerimenti

public class MyList<T> 
    extends ArrayList<T>
{
}

MyList<SomeObject> list = new MyList<SomeObject>();

o

public class MyList
    extends ArrayList<SomeObject>
{
}

MyList list = new MyList();

Non si dovrebbe estendere ArrayList, estendere AbstractList invece:

public class MyList<T> extends AbstractList<T> {
    public int size() {...}
    public T get(int index) {...}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top