Je vais avoir une crampe cérébrale: j'ai un Comment puis-je résoudre ce problème sans avoir Pour créer une nouvelle liste? p> Clarification: Strong> Je ne veux pas que la liste soit créée comme interface publique Quelqu'unInterface code> et un SOMECLASS de classe privée statique tente> et essaye de renvoyer une liste ; code> ligne ci-dessous): Liste import java.util.ArrayList;
import java.util.List;
public class GenericList1 {
public interface SomeInterface
{
public int getX();
}
private static class SomeClass implements SomeInterface
{
final private int x;
@Override public int getX() {
return this.x;
}
public SomeClass(int x) { this.x = x; }
}
public static void main(String[] args) {
List<SomeInterface> list = createList(10);
printList(list);
}
private static void printList(List<SomeInterface> list) {
for (SomeInterface si : list)
System.out.println(si.getX());
}
private static List<SomeInterface> createList(int n) {
List<SomeClass> list = new ArrayList<SomeClass>();
for (int i = 0; i < n; ++i)
list.add(new SomeClass(i));
return list;
}
}
4 Réponses :
Vous devez redéfinir votre méthode comme et de même, les autres déclarations de la liste. Cela vous permet de gérer des listes génériques polymorphiquement, (Si vous souhaitez ajouter de nouveaux éléments à une liste, vous devez utiliser < Code> Liste Super Quelqu'unInterface> Code> à la place.) P> Cet idiome est connu de l'abréviation Comme d'autres l'ont noté, cet idiome est nécessaire car une liste Liste SOMECLASP implémente un individuinterface code>. La raison de cela est complètement expliquée dans le document référé. P> p>
Ah, ok, cela fonctionne. Dans mon vrai programme, je retourne une liste <> enveloppée par des collections.unmodifiablelist () afin qu'ils vont être en lecture seule.
La réponse avait un lien vers le point 28 mais le lien est maintenant mort. Un fichier PDF du livre est disponible ici: GITUB.COM_LDFAIZTT/CSE331/BLOB/MASTER/...
Contrairement à la croyance populaire, Vous pouvez modifier votre code comme suit: p> Liste list dérivé étend la base code>. < P> Juste parce que les classes partagent une hiérarchie ne signifie pas que les collections d'entre elles font. Cela est vrai pour les génériques en général. P>
Oui, c'est la solution évidente mais je ne veux pas faire ça; Voir mes modifications.
private static List<SomeInterface> createList(int n) {
List<SomeInterface> list = new ArrayList<SomeInterface>();
for (int i = 0; i < n; ++i)
list.add(new SomeClass(i));
return list;
}
C'est la solution évidente mais je ne veux pas faire ça; Voir mes modifications.
Je modifierais les signatures des méthodes telles que:
private static void printList(List<? extends SomeInterface> list) {
for (SomeInterface si : list)
System.out.println(si.getX());
}
private static <T super SomeClass> List<T> createList(int n) {
List<T> list = new ArrayList<T>();
for (int i = 0; i < n; ++i)
list.add(new SomeClass(i));
return list;
}