Je l'interface suivante:Comment spécifier génériquement une liste Serializable
public interface Result<T extends Serializable> extends Serializable{
T getResult();
}
Avec cette interface, je ne peux pas définir une variable de type
Result<List<Integer>>
parce que la liste ne sont pas sérialisable.
Cependant, si je change l'interface à ceci:
public interface Result<T> extends Serializable{
T getResult();
}
Il devient impossible de mettre en œuvre, avec la compilation de vérification, parce qu'il n'y a aucune garantie que T est sérialisable, et le point de l'ensemble de la classe est de stocker le résultat pour que je puisse le récupérer plus tard, éventuellement après un transfert sur internet. Ma question est la suivante: existe-t-il un moyen de déclarer une variable de sorte qu'elle soit de deux types ou existe-t-il un autre moyen de le faire que je ne vois pas? Alors, peut-être quelque chose comme:
(List<Integer> extends Serializable) value = new ArrayList();
Je suis en train de mettre autant de la charge de ce problème sur la mise en œuvre, afin que les consommateurs futurs de cette interface ne sont pas conscients du problème.
Merci pour votre aide!
Voici un exemple plus détaillé de ce que j'essaie de faire: J'appelle un serveur, Le résultat de ce que je veux stocker dans un objet de résultat, mais je ne veux pas avoir à faire face à la coulée. Ainsi, chaque méthode pouvant être appelée sur le serveur définira le type du résultat en utilisant des génériques. Cet objet résultat stockera également d'autres méta-données sur le résultat, par exemple, il y a peut-être trop d'informations à renvoyer. Dans la plupart des cas, je souhaite utiliser une liste, mais l'interface List n'est pas sérialisable, bien que la plupart des implémentations le soient. Donc, comment spécifier que le type utilisé doit être Serializable, mais permettre toujours une liste (et non une implémentation spécifique de List) à utiliser?
Pouvez-vous clarifier ce que vous essayez de faire? Peut-être donner un plus grand exemple? –
Vous devez savoir que même si T est marqué comme étant sérialisable, il peut toujours contenir une référence à un objet qui n'est pas sérialisable. Ainsi, il passera l'analyse statique des génériques mais échouera à l'exécution. – Patrick
Vrai, mais c'est une erreur que le consommateur a faite, et pas un défaut dans mon code. Si un consommateur déclare quelque chose comme sérialisable, et ne suit pas les exigences de sérialisation, il n'y a rien que je puisse faire. – Megamug