Question

J'ai essayé d'étendre la classe ArrayList sans beaucoup de succès. Je veux l'étendre, et être en mesure de le paramétrer.

Donc, normalement, vous avez quelque chose comme

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

Je veux

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

qu'étendre ArrayList ne fonctionne pas.

public class MyList extends ArrayList ...

lorsque je tente de l'utiliser, je reçois l'erreur

  

Le type MyList n'est pas générique; il   ne peut pas être paramétrés avec des arguments   

J'ai essayé de variations

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

sans succès, Si je le sous-objet derrière le nom de la classe, il semble fonctionner, mais cache des méthodes dans la classe de sous-objet pour une raison quelconque.

Toutes les pensées ou des suggestions sur la façon d'obtenir ce droit de travail sont appréciés.

Était-ce utile?

La solution

Vous devez spécifier un type pour le paramètre de type de ArrayList. Pour les paramètres de type générique, est assez courante T. Étant donné que le compilateur ne sait pas ce qu'est un est MyList, vous devez ajouter un paramètre de type à qui peut avoir List le type passé dans Ainsi, vous obtenez:.

public class MyList<T> extends ArrayList<T>

En outre, vous pouvez envisager la mise en œuvre et de déléguer à <=> un <=>, plutôt que héritant de <=>. "Composition d'objets sur Favor héritage de classe. [ Design Patterns p. 20]"

Autres conseils

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

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

ou

public class MyList
    extends ArrayList<SomeObject>
{
}

MyList list = new MyList();

Vous ne devriez pas étendre ArrayList, étendre AbstractList place:

public class MyList<T> extends AbstractList<T> {
    public int size() {...}
    public T get(int index) {...}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top