2017-02-21 1 views
2

Le code suivant produit un avertissement «Opération non contrôlée ou non sécurisée». Comment puis-je émettre le Objecto pour saisir T sans provoquer l'avertissement? Je sais que je pourrais supprimer l'avertissement, mais je veux savoir la "bonne" manière.Comment convertir un type générique?

public class MyType<T> { 
    T cast(Object o) { 
     return (T)o; //<--- what causes the warning 
    } 
} 
+0

Ce que vous faites est de type pas sûr, donc oui, vous allez obtenir un avertissement qu'il est de type pas sûr. –

Répondre

8

Type erasure. Vous pouvez passer le Class<T> comme argument et l'utiliser. Comme,

T cast(Class<T> cls, Object o) { 
    return cls.cast(o); 
} 

ou même

public class MyType { 
    public static <T> T cast(Class<T> cls, Object o) { 
     return cls.cast(o); 
    } 
} 

que vous pouvez appeler comme

int t = MyType.cast(Integer.class, 10); 

Alternativement, mais sur les mêmes lignes, vous pourriez passer le Class dans le constructeur comme

public class MyType<T> { 
    public MyType(Class<T> cls) { 
     this.cls = cls; 
    } 

    private Class<T> cls; 

    T cast(Object o) { 
     return cls.cast(o); 
    } 
} 

Et puis l'utiliser comme

MyType<Integer> myType = new MyType<>(Integer.class); 
int t = myType.cast(10); 
+0

Salut Elllioitt comment passez-vous classe comme argument? Pouvez-vous me montrer un exemple concret? – Tania

+0

'Chaîne foo = cast (String.class," foo ");' – Izruo

+0

@Tania Qu'est-ce que vous avez besoin de cette méthode de cast? Dans quel contexte MyType va-t-il être utilisé? –