Supposons que j'ai la classe suivante: La question est de savoir si il est possible d'utiliser des génériques pour modifier la signature de la méthode de Si ceci est Pendant tout possible, si j'avais soit code> est un type qui stocke un objet de type A ou B. get () code> récupère qu'un objet. p> get () code> de sorte que le type renvoyé soit Pas seulement objet code>, mais tout super-type commun d'A et B. Par exemple, un obtenir () code> retourner numéro code>, un get () code> retour itérant collection get () code> retour foo code>). P> soit get () code> peut revenir? Est-ce que c'est cru liste code>, wildcard list > Code> ou quelque chose d'autre entièrement? P> p>
4 Réponses :
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: 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 code> au lieu d'un A code> ou d'un B code>), alors vous êtes dans la meilleure position pour définir ce qui devrait être conservé dans une classe commune explicite. P> p>
A et B peuvent être des classes non liées que je ne peux pas modifier, telles que entier code> et long code> 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.
Autant que je sache, il n'est pas possible: votre CODE> classe fait une hypothèse sur un troisième type générique (appelons-le c code>) , auxquels A et B étendent: Bien qu'il soit possible d'écrire quelque chose comme la classe publique, soit {} code>, Java ne permet pas de référencer un type générique. , donc vous ne pouvez même pas écrire quelque chose comme ni . Clairement une honte, car votre code> sera vraiment pratique :) p>
Et apparemment Javac 7 permet une référence en avant, de sorte que code> fonctionne également. (Référence directe jamais interdite par JLS)
Cela fonctionnerait certainement, mais vaincre le but, car vous devriez vous identifier le Superype commun. Cela dit, vous pourrait i> déduire le Superype et fournir une sorte de même fonctionnalité en utilisant un mélange de génériques et d'introspection.
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() {....}
}
Vous êtes des points valables, je pensais plus dans les lignes de C code> une interface ou une classe, mais l'exemple n'est pas clair dans son sens: p
L'inférence Java a quelque chose de similaire, nous pouvons faire Cependant, il n'y a probablement aucun moyen de la transformer en une méthode d'instance. Nous devrions écrire p> qui n'est pas pris en charge dans Java P> P>
Est-ce que quelqu'un a réellement répondu à la question sur
soit, liste > code>? Quoi qu'il en soit, il aurait besoin d'être Liste > Code>.