Casting de Bouton est redondant - Pourquoi?
Je viens de tombé sur ce message intéressant de le compilateur et je ne sais pas pourquoi cela se produit. Ici c'est le cas
Exemple 1.
Button test = (Button) findViewById(R.id.someButtonId);
test.setOnClickListener(this);
Exemple 2.
findViewById(R.id.someButtonId).setOnClickListener(this);
Dans le premier exemple, j'ai besoin de jeter un objet retourné par findViewById
à Button
. Dans le deuxième exemple, je n'ai pas de cast de l'objet retourné parce que je n'ai pas utiliser un autre Button
objet de classe. Si j'essaie de le lancer via
((Button)findViewById(R.id.someButtonId)).setOnClickListener(this);
Je vais avoir l'avertissement Casting findViewById(R.id.someButtonId) to Button is redundant
.
Pourquoi est-ce arrivé? Je n'essaie pas de les supprimer en fonte d'avertissement. Je veux connaître la logique qui sous-tend cette et pourquoi casting n'est pas nécessaire si je ne cherche pas à initialiser un autre objet avec l'objet renvoyé par findViewById
.
Je sais comment l'enlever :). Je n'ai pas besoin de ça. Je demande pourquoi casting n'est pas nécessaire.
🙁 je ne suis pas aller de l'avertissement
Utilisation IntelliJ IDEA et vous. Le meilleur outil! 😉
:O je suis à l'aide d'Eclipse, merci quand même
OriginalL'auteur sandalone | 2012-03-01
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle vous obtenez c'est parce que
findViewById
retourneView
et cette classe définit déjà la méthodesetOnClickListener
. Cela signifie que, même sans faire le casting, vous pouvez définir l'auditeur. Ainsi, votre plâtre est redondant.Son parfait comme dans l'Exemple 2.
Pourquoi pensez-vous qu'il ne serait pas sécuritaire?
Vous êtes à tort concerné dans cette affaire. Il est parfaitement bien de travailler avec des objets parents. Je suis totalement sûr que vous n'avez pas envie de faire quelque chose de mal si vous avez accès à une méthode de l'interface à droite. Et encore c'est juste le même cas que l'accès à une méthode de la classe parente. Après tout, c'est toujours le cas que vous avez fait appel à la méthode de
Button
, juste l'appel de la "chaîne" est différent.vous devriez vous familiariser davantage avec la programmation de la notion de polymorphisme - docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
OriginalL'auteur Boris Strandjev
La findViewById() renvoie toujours la vision qui est la mère de tous les points de Vue comme ImageView, Bouton...
La setOnClickListener est une méthode de la classe View. De sorte que vous pouvez attraper les événements click simplement sans moulage Bouton. Je pense donc que ce qu'il dit redondant.
OriginalL'auteur Sadeshkumar Periyasamy
La raison pour cela est que dans l'Exemple 1 vous avez explicitement le besoin de trouver un Bouton parce que vous êtes de l'affecter à un Bouton de la variable.
La OnClickListener est pour tout type de point de Vue, si vous n'avez pas besoin de la convertir en une sous-classe spécifique de Vue de définir un OnClickListener.
Absolument. Quelle que soit la Vue est trouvé dans l'exemple 2, un OnClickListener peuvent être fixés sur elle.
Vous serez de toute façon sais que c'est un bouton pour vous, parce que vous n'utilisez pas l'id someButtonId pour toute autre opinion, ne vous?
OriginalL'auteur Eric Nordvik
Ce qui se passe parce que vous n'avez pas besoin de jeter
View
àButton
afin d'appelersetOnClickListener
qui est défini dansView
. Il suffit de fairefindViewById(R.id.someButtonId).setOnClickListener(this);
OriginalL'auteur devmiles.com
Je devine setOnClickListener() est une méthode dans la Vue plutôt que le Bouton, et donc yep: le casting est redondant.
OriginalL'auteur John3136