8
votes

Plusieurs limites génériques

Supposons que j'ai la classe suivante: xxx

soit est un type qui stocke un objet de type A ou B. get () récupère qu'un objet.

La question est de savoir si il est possible d'utiliser des génériques pour modifier la signature de la méthode de get () de sorte que le type renvoyé soit Pas seulement objet , mais tout super-type commun d'A et B. Par exemple, un peut avoir obtenir () retourner numéro , un , définissez > peut avoir get () retour itérant < / code> ou collection , et ainsi de suite. (Évidemment, un doit avoir get () retour foo ).

Si ceci est Pendant tout possible, si j'avais soit , list > , quel type get () peut revenir? Est-ce que c'est cru liste , wildcard list ou quelque chose d'autre entièrement?


1 commentaires

Est-ce que quelqu'un a réellement répondu à la question sur soit , liste > ? Quoi qu'il en soit, il aurait besoin d'être Liste .


4 Réponses :


1
votes

Pourquoi ne pas définir une classe abstraite C, contenant autant de logique commune à A et B comme vous le juge nécessaires et que vous vous référez à celui de votre classe: xxx

qui ne semble pas comme une grande partie d'une réponse, mais puisque Java efface de toute façon vos informations de type lors de la compilation (que cela dit, votre code compilé ne voit que objet au lieu d'un A ou d'un B ), alors vous êtes dans la meilleure position pour définir ce qui devrait être conservé dans une classe commune explicite.


2 commentaires

A et B peuvent être des classes non liées que je ne peux pas modifier, telles que entier et long ci-dessus; L'abstraction à une superclasse commune peut ne pas être possible.


Vous pouvez peut-être envelopper ces classes, tout comme le frameoop Framework avec Inthitable, etc. Les wrappers peuvent ensuite dériver d'une classe commune et abstraite.




1
votes

Vous devez vous assurer que A et B partagent une ascendance commune.

public class Either<C, A extends C, B extends C> {
    public C get() {....}
}


1 commentaires

Vous êtes des points valables, je pensais plus dans les lignes de C une interface ou une classe, mais l'exemple n'est pas clair dans son sens: p



2
votes

L'inférence Java a quelque chose de similaire, nous pouvons faire xxx

Cependant, il n'y a probablement aucun moyen de la transformer en une méthode d'instance. Nous devrions écrire xxx

qui n'est pas pris en charge dans Java


0 commentaires