Question

J'essaie de jeter un objet à ma classe d'action, mais il se traduit par un avertissement:

Type safety: Unchecked cast from Object to Action<ClientInterface>

Action<ClientInterface> action = null;
try {
 Object o = c.newInstance();
 if (o instanceof Action<?>) {
  action = (Action<ClientInterface>) o;
 } else {
  // TODO 2 Auto-generated catch block
  throw new InstantiationException();
 }
 [...]

Merci pour toute aide

Autres conseils

Comme d'habitude, Jon Skeet est exact.

Pour des précisions sur la partie non facilement de sa réponse:

Étant donné

class ClientAction implements Action<ClientInterface> {}

Vous pouvez écrire:

Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();

Ceci élimine à la fois la distribution et la mise en garde, au prix de l'introduction d'un type non générique de sorte que vous pouvez utiliser .class pour obtenir un objet Class tapé avec une précision suffisante.

L'avertissement signifie que le compilateur ne peut pas garantir la sécurité de type, même si la coulée fonctionne très bien à l'exécution. En raison de l'effacement, lors de l'exécution de la coulée est tout simplement un casting à l'action. Il est possible que la classe générique sous-jacente est pas de type ClientInterface comme prévu. Dans ce cas, le problème apparaîtra plus tard (peut-être même beaucoup plus tard), en tant que ClassCastException.

Dans ce cas précis, je recommande de supprimer cet avertissement spécifique par la directive du compilateur suivant:

@SuppressWarnings("unchecked")

Ne vous inquiétez pas. Il est parce que le compilateur Java n'a aucun moyen de savoir, quel est le type réel de l'objet.

Vous avez perdu les informations de type à cause de l'effacement (à savoir, les types paramétrés ont été effacés), d'où l'avertissement. Vous ne pouvez rien faire à ce sujet, autre que nettoyer le code environnant afin que les médicaments génériques sont plus fréquemment utilisés, de sorte que vous pouvez transmettre les informations de type générique et éviter la coulée du tout.

Ceci est un baissés. Il est le casting dynamique où le compilateur n'a aucune idée de l'objet réel de la référence pointe.

Vous obtenez cet avertissement parce que le type de cible de la Action<ClientInterface> coulée est un type paramétrés et le compilateur ne peut garantir que l'objet type étant casted est du même type.

Si vous ne voulez pas supprimer cet avertissement et ne se soucient pas du paramètre de type, vous pouvez modifier le code à cela en utilisant des caractères génériques:

Action<?> action = null;
try {
 Object o = c.newInstance();
 if (o instanceof Action<?>) {
  action = (Action<?>) o;
 } else {
  // TODO 2 Auto-generated catch block
  throw new InstantiationException();
 }
 [...]

Ceci est beaucoup plus sûr parce que le instanceof ne peut pas vérifier que o est un objet de Action<ClientInterface>, il suffit de vérifier si o est un objet de Action depuis plus d'informations de type générique sera Erased lors de l'exécution.

scroll top