2010-12-13 77 views
2

Un autre de ceux comment je fais toArray() sans des questions d'avertissements, mais c'est différent de la plupart de ceux postés ici.Débarrassez-vous des avertissements dans la liste <GenericClass <T>> .toArray()

Comment réécrire l'implémentation de la méthode (sans modifier la signature de la méthode) pour la compiler sans avertissement?

La difficulté apparente ici est que les informations de classe pour T ne sont pas disponibles pendant l'exécution. Cependant, le type de retour est également un type effacé pendant l'exécution, donc il n'y a pas vraiment de raison que cela ne puisse pas être fait. Alors, comment faire ceci si vous voulez appliquer la sécurité de type à la compilation?

Merci

<T> GenericClass<T>[] toGenericArray(List<GenericClass<T>> list) { 
    return list.toArray(new GenericClass[0]); 
} 
+0

Un exemple parfait de pourquoi Java est stupide = P – Falmarri

+6

@Falmarri: Plus précisément, un exemple de quelque chose en Java qui est stupide. Cela fonctionne très bien et certaines choses ne vont pas. Je suis d'accord que l'effacement est stupide mais il est injuste de généraliser à partir de cela. –

Répondre

1

Vous ne pouvez pas. Comme les tableaux sont covariants, il est impossible d'avoir une sécurité de compilation pour un tableau qui contient un type paramétré. (? À moins que vous utilisez <> qui est légal.)

Ce sera toujours légal:

GenericClass<String>[] array = new GenericClass[1]; 
Object[] brokenArray = array; 
brokenArray[0] = new GenericClass<Integer>(); 
String value = array[0].getGenericValue(); //kaboom 

compilateur ne peut pas vous protéger de cela, il vous oblige à reconnaître/supprimer qu'il ya un avertissement .

+0

+1 pour mentionner que les tableaux de Java sont covariants. En fait, (voir ma question de suivi). Est-il possible de créer un tableau générique (directement ou indirectement) sans avertissement? Il ne devrait jamais y avoir, non? Étant donné le fait, il est toujours possible de créer du code entièrement légal qui produit ClassCastException à la ligne "Wrong"? – RAY

1

Vous pouvez ajouter une annotation @SuppressWarnings("unchecked"). Cela ne change pas la signature de la méthode et vous permet de faire des choses "dangereuses" sans générer d'avertissement. Votre code est vraiment sûr, donc c'est OK pour supprimer l'avertissement. Notez que, la réponse de Per @ Affe, de mauvaises choses peuvent se produire après votre retour, mais vous pouvez certainement implémenter votre méthode correctement.

La structure des collections Java fait ce genre de choses en interne, donc ce n'est pas seulement un hack. Eh bien, il est un hack, mais c'est un hack OK. Eh bien, ce n'est pas OK, mais ça fonctionne. Kinda.