Quand j'essaye de lancer en Java et d'écrire ce qui suit, j'obtiens un avertissement non vérifié.
Object obj = new SomeClass();
SomeClass some = (SomeClass)obj;
Pour éviter cela, utilisez la méthode cast
dans la classe Class
.
Object obj = new SomeClass();
SomeClass some = SomeClass.class.cast(obj);
Il semble que cela devrait être fait comme ça.
Alors que se passe-t-il dans le cas suivant?
Object obj1 = new Hoge<Fuga>();
Hoge<Fuga> some1 = (Hoge<Fuga>)obj1;
Object obj2 = new Hoge<Piyo>(); //Piyo est une sous-classe de Fuga
Hoge<? extends Fuga> some2 = (Hoge<? extends Fuga>)obj2;
Object obj3 = new Hoge<Moge>(); //Moge est la super classe de Fuga
Hoge<? super Fuga> some3 = (Hoge<? super Fuga>)obj3;
En conclusion, il semble que l'avertissement non vérifié ne peut être évité pour les moulages utilisant des génériques.
Dans le cas de Java, le type spécifié par le générique est supprimé au moment de la compilation, il semble donc qu'il n'est pas possible de le juger correctement et de le convertir.
Même avec Stackoverflow "Que dois-je faire?" "Je ne peux pas. Abandonnez et utilisez @ SuppressWarnings
" Est en cours d'échange.
En passant, l'implémentation de la méthode cast
de la classe Class
mentionnée ci-dessus est comme ça.
@SuppressWarnings("unchecked")
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException(cannotCastMsg(obj));
return (T) obj;
}
Après tout, vous utilisez @SuppressWarnings (" non coché ")
(colère)
Donc, il semble que vous deviez ajouter @SuppressWarnings (" non coché ")
tranquillement, ou créer votre propre méthode de cast juste pour éviter les avertissements comme la méthode cast
de la classe Class
.
Recommended Posts