Je cherche une réponse pour cela, mais en vain. Ma question est de savoir pourquoi n'est-il pas possible de compter avec des génériques. J'ai une classe appelée travail et étend une classe appelée modèle maintenant, je reçois une collection d'emplois à partir d'un code réutilisable qui génère une liste de modèles p> où jobmapper.fetchall () renvoie une liste dans laquelle chaque modèle à l'intérieur est un objet d'emploi. P> J'ai supposé que cela fonctionnerait car je peux faire: P> EditText mUsername = (EditText) findViewById(R.id.editUserName);
4 Réponses :
Vous ne pouvez pas faire cela, car Java ne le permet pas. Lisez ceci. Vous devriez faire le truc:
Super! Ça a fait l'affaire. Pendant que je reçois un avertissement de moulage non coché, je peux vivre avec cela parce que je suis sûr que les valeurs étant lancées. Merci de votre aide. Appréciez beaucoup!
Au fait: c'est une jolie mauvaise idée i>. Il ne cache que l'avertissement et supprime efficacement toutes les informations de type générique (et toutes les garanties que vous obtenez de génériques) à partir de cette liste.
@ Joachim Y a-t-il une meilleure façon de le faire? Pouvez-vous s'il vous plaît poster une réponse. Merci
@Jonastandinco: Un meilleur moyen est de renvoyer une liste
Liste
+1 à @ Jochimsauer. Si Java vous dit que cela ne veut pas faire quelque chose, signifie que vous faites quelque chose de mal et que vous devriez redéfinir votre code s'il est possible.
Vous pouvez effectuer ce qui suit: (et supprimer l'avertissement Le compilateur n'autorise pas la distribution que vous avez essayée car une fois que vous avez une liste Par conséquent, soyez prudent lorsque vous permettez à ce type de trucs - il peut vous revenir plus tard sous une forme de classecastException où vous ne vous attendez pas à ce que cela ne vous attendez pas à ce que cela ne vous attendez pas à ce que cela ne vous attendait pas à ce que cela ne vous attendez pas à ce que cela ne vous attendez pas à ce que cela ne vous attendez pas à ce que cela ne vous attendez pas à ce que cela ne vous attendez pas à ce que cela ne vous attendez pas à ce que cela ne vous attendez pas à ce que cela ne vous attendez pas à ce que cela ne vous attendait pas à ce que cela se produise. P> En ce qui concerne votre dernière question: Notez que, tandis que Job est un modèle strong> et un emploi [] est un modèle strong> [], ce n'est pas vrai pour les collections: liste
List<? super Job> jobs = jobMapper.fetchAll();
Cela permet uniquement d'itération des travaux en tant qu'objets (et de les jeter au travail).
Parce qu'il n'est jamais explicite une liste d'emplois. :RÉ
Je suis désolé mais cela ne fonctionne pas pour moi. Tandis que la ligne ne pose qu'un avertissement. Je ne peux plus utiliser la variable d'emplois car je l'utilise dans un arrayadapter d'adaptateur de tableau
Parce que vous ne peut pas B> Assurez-vous que Fetchall renvoie toujours une liste d'emplois. En utilisant ce type de logique, vous pouvez lancer Java.Lang.System à Clonableable et clonable pour obtenir un tout nouveau PC.
Ok, alors vous me donnez un -1 parce que ma solution pourrait i> ne fonctionne pas en fonction de la hiérarchie de type / de classe de jobmapper de code>, et donnez plutôt une solution que vous connaissez déjà jamais i> travailler pour le problème de l'OP? Hmmm....
Il n'est pas autorisé car il serait / pourrait conduire à des erreurs d'exécution. Et si la liste contenait déjà des objets qui ne sont pas de classe Vous devriez soit: P>
Changement lancer l'objet au lieu de la liste, c'est-à-dire. emploi code>? P>
jobmapper.fetchall () code> Pour retourner
Liste
emplois job = (job) emplois.get (0) code>. p> li>
ol>
De la même manière, l'exemple de la vision de l'Edittext dans l'exemple de FindviewyID () pourrait conduire à RunTimeExceptions .. mais cela est autorisé néanmoins.
Je ne peux pas faire jobmapper.fetchall () pour revenir la liste
@Baske: Le casting vers EditText jette un objet. Vous devez vous attendre à une clastingexception lorsque vous faites une jette comme ça. Mais lors de la récupération d'un objet d'un conteneur générique, vous ne déplacez pas l'élément renvoyé et vous n'obtenez donc jamais une clascastexception (sauf si vous ne jetez pas votre collection et ignorez tous les avertissements - voir le commentaire de Joachim Sauer à la solution de Leonidas).
@Peterrader: Oui, mais cela signifie simplement OP n'a pas fourni suffisamment d'informations. La grande différence est que lorsque vous utilisez (job) emplois.get (0) code> Vous obtiendrez la clascastexception sur le site de votre casting. Lors de la coulée de votre liste, vous n'obtiendrez pas de clascastexception (car les informations de type générique sont supprimées par le compilateur) avant d'essayer de retirer un élément de la liste (où le compilateur ajoute implicitement une distribution au travail). Cela pourrait être assez éloigné du code où vous lancez la liste et pourrait être difficile à déboguer.
@Axel: Le casting à EditText jette une vue, pas un objet.
@baske: Je voulais dire que vous avez lancé l'objet que vous récupérez de la collection par opposition à la mise en place de la collection. Je suis tout à fait sûr qu'une vue est un objet (au moins en Java). Je n'ai pas dit "moulage à l'objet" ou "jeté de l'objet".
Dupliquer possible de Comment lancer une liste d'objets d'un type à un autre en Java?
Le travail est une sous-classe de modèle, travail [] est une sous-classe de modèle [], mais la liste n'est pas une sous-classe de la liste .
@Jermainexu: "Sous-type" est plus correct que "Sous-classe" ici. Comme
list code> n'est pas vraiment une classe, mais un type. (Et vous pourrait i> argumenter que
emploi [] code> n'est pas une classe non plus).
Exactement, merci pour votre correction. @ Jochimsauer