9
votes

Ne pouvait pas souscrire à l'aide de la classe de liste dans Java

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 xxx pré>

maintenant, je reçois une collection d'emplois à partir d'un code réutilisable qui génère une liste de modèles p> xxx Pré>

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 commentaires

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 n'est pas vraiment une classe, mais un type. (Et vous pourrait argumenter que emploi [] n'est pas une classe non plus).


Exactement, merci pour votre correction. @ Jochimsauer


4 Réponses :


12
votes

Vous ne pouvez pas faire cela, car Java ne le permet pas. Lisez ceci. Vous devriez faire le truc: xxx < / p>


5 commentaires

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 . 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 lorsque vous avez besoin d'une liste . Le système de type est conçu pour interdire la liste de coulée à Liste , car il ne peut pas vérifier si la distribution est valide. Au moment de l'exécution (c'est-à-dire qu'il s'agit d'une "casting non cochée"!). Il est permis de compiler le code Legacy (pré-génériques) avec le code des génériques.


+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.



3
votes

Vous pouvez effectuer ce qui suit: xxx

(et supprimer l'avertissement si vous êtes convaincu, il est sécurisé dans votre cas )

Le compilateur n'autorise pas la distribution que vous avez essayée car une fois que vous avez une liste et une liste pointant vers la même liste, vous pouvez ajouter des instances de modèle à ce dernier et faire la liste avoir un modèle Article dedans, qui brise la sécurité du type.

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.

En ce qui concerne votre dernière question: Notez que, tandis que Job est un modèle et un emploi [] est un modèle [], ce n'est pas vrai pour les collections: liste n'est pas une liste . C'est un peu surprenant, mais il découle de mon explication ci-dessus. Il ruinerait la sécurité de type pour permettre à cette coulée sans avertissement / erreur.


0 commentaires

0
votes
List<? super Job> jobs = jobMapper.fetchAll();

5 commentaires

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 et ne pouvait plus ajouter cette collection à l'adaptateur car elle ne la reconnaît plus comme liste


Parce que vous ne peut pas 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 ne fonctionne pas en fonction de la hiérarchie de type / de classe de jobmapper , et donnez plutôt une solution que vous connaissez déjà jamais travailler pour le problème de l'OP? Hmmm....



0
votes

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 emploi ?

Vous devriez soit:

  1. Changement jobmapper.fetchall () Pour retourner Liste .

  2. lancer l'objet au lieu de la liste, c'est-à-dire. emplois job = (job) emplois.get (0) .


6 commentaires

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 car Fetchall est une méthode d'une classe de base que je répète. Je fais aussi usermapper.fetchall () où il renvoie un objet utilisateur (l'utilisateur étend le modèle).


@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) 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".