Puis-je contenir deux types différents dans une collection? Par exemple, puis-je avoir la liste
6 Réponses :
réponse courte? Non. Vous pouvez (bien sûr) avoir une liste Vous pouvez créer une liste d'objets de conteneur et cet objet conteneur contiendrait soit un et implémenter Bien sûr, la question réelle em> est la raison pour laquelle vous voulez faire cela? Je m'attendrais à ce que la collection contienne des objets du même type, puis je peux parcourir et effectuer des actions sur ces objets sans vous soucier de ce qu'ils sont. Peut-être que votre hiérarchie de l'objet a besoin d'une nouvelle pensée? P> p> code> de objets code>, mais vous pouvez ensuite mettre rien em> dedans, pas seulement String code> ou integer code> objets. entier code> ou chaîne code> (peut-être via des génériques). Un peu plus de tracas. P> contenait contenait
Nope. Vous avez quelques alternatives, bien que:
Vous pouvez utiliser une liste Vous pouvez utiliser une liste public boolean isItAString() { return (this.stringValue != null }
Pourriez-vous s'il vous plaît expliquer la deuxième option?
Non. Pensez-y de cette façon: avec des génériques, toute l'idée est de fournir une sécurité de type. Cela ne serait pas possible si vous pouviez mettre des objets de types différents.
Vous pouvez utiliser le si Vous voulez vous assurer que seulement java.util.list non générique code> pour votre but. P> chaîne code> ou integer code> Les objets entrent dans la liste, vous pouvez créer votre propre implémentation de la liste, comme vous le souhaitez: P> public class MySpecialList {
private List list= new LinkedList();
...
public void add(final String string) {
list.add(string);
}
public void add(final Integer integer) {
list.add(integer);
}
...
// add rest of List style methods
}
En plus des belles réponses déjà fournies ...
éventuellement, vous avez les deux types de données dans votre algorithme. Mais Créer deux listes dactylographiques pourrait être plus claire pour votre algorithme, vous garderiez toujours le "Type-Séance "Et porter toutes vos données. Les échantillons de deux code suivent, le second regroupant les deux listes d'un objet myData. P>
Si vous faites quelque chose comme une programmation fonctionnelle en Java 8 ou plus, vous voudrez peut-être essayer JavaSealeUnions A >: Je n'ai pas testé cela, mais je pense que vous avez eu l'idée. P> P>
Ce que vous décrivez est le cas d'utilisation parfait pour le modèle de visiteur
Utilisation: p>
interface UnionType {
<R> R when(Cases<R> c);
interface Cases<R> {
R is(StringContainer stringContainer);
R is(IntegerContainer integerContainer);
}
}
class StringContainer implements UnionType {
private final String value;
public StringContainer(String value) { this.value = value; }
public String getValue() { return value; }
@Override
public <R> R when(Cases<R> cases) {
return cases.is(this);
}
}
class IntegerContainer implements UnionType {
private final Integer value;
public IntegerContainer(Integer value) { this.value = value; }
public Integer getValue() { return value; }
@Override
public <R> R when(Cases<R> cases) {
return cases.is(this);
}
}
Une contre-question: pourquoi auriez-vous deux types différents types i> dans une collection B>?
@Ballusc - Un cas d'utilisation pour une telle construction que j'ai couru est un objet de modèle. par exemple. Dans une API de repos, cela correspond à l'objet de transfert de données (DTO) représentant un message protobuf avec un champ code> code>. Un
OneOf code> est essentiellement un syndicat. Il peut contenir l'un des types de types différents spécifiés. Une valeur de l'un de ces types occupe la même mémoire et un seul type peut être stocké à la fois. Il semble être analogue à l'union code> dans C.