Come faccio a parametrizzare una collezione estesa
-
21-08-2019 - |
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.
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) {...}
}