J'ai cette méthode statique:
final Map<String, Iterable<V>> results
Et j'appelle ceci:
final Map<String, Collection<V>> results
le problème est pour une raison quelconque que je peux ' t convertir un Set
en Iterable
... Je recherche un supertype pour List
et Définissez
L'erreur que j'obtiens est:
Types non convertibles; impossible de diffuser
'java.util.HashMap
>' à
'java.util.Map
>'
J'essaie également de convertir List
en Iterable
comme je l'ai mentionné, je recherche un supertype pour la liste et l'ensemble ..peut-être juste utiliser Collection?
Mettre à jour , j'ai essayé d'utiliser:
private static <T, V, E> void RunMap( final Map<String, Iterable<V>> results, final Asyncc.IAsyncCallback<Map<String, Iterable<V>>, E> f) { ... }
au lieu de
static <V, T, E> void GroupToSets( final Iterable<T> items, final Asyncc.IAsyncCallback<Map<String, Set<V>>, E> f) { final HashMap<String, Set<V>> results = new HashMap<>(); final Iterator<T> iterator = items.iterator(); if (!iterator.hasNext()) { f.done(null, results); return; } RunMap((Map<String, Iterable<V>>)results, f); }
J'ai le même problème.
3 Réponses :
Vous pouvez essayer de changer la définition en:
static <V, T, E> void GroupToSets( final Iterable<T> items, final Asyncc.IAsyncCallback<Map<String, ? extends Iterable<V>>, E> f) { final Map<String, ? extends Set<V>> results = new HashMap<>(); final Iterator<T> iterator = items.iterator(); if (!iterator.hasNext()) { f.done(null, results); return; } RunMap(results, f); } static <T, V, E> void RunMap( final Map<String, ? extends Iterable<V>> results, final Asyncc.IAsyncCallback<Map<String, ? extends Iterable<V>>, E> f) { }
J'ai essayé ça, j'obtiens ce problème Mauvais 2ème type d'argument. Trouvé: 'java.util.HashSet
@AlexanderMills, vous devez passer de RunMap ((Map
à ce RunMap (résultats, f);
supprimer casting, ça marche bien
Remplacez la déclaration RunMap
par:
private static <V, E, M extends Map<String, ? extends Iterable<V>>> void RunMap( final M results, final Asyncc.IAsyncCallback<M, E> f) {
Les génériques en Java ne sont pas une covariance, c'est-à-dire lorsque RunMap
attend un Map
vous ne pouvez pas lui transmettre une instance Map
.
Pour résoudre ce problème, vous pouvez utiliser un caractère générique délimité ? étend Vector
, mais il existe une corrélation entre les deux arguments RunMap
. Le type des valeurs dans les deux cartes doit être le même, vous devez donc définir un type de méthode T extend Iterable
et l'utiliser lors de la définition du type des arguments de méthode: Map
et Asyncc.IAsyncCallback
.
Vous pouvez raccourcir un peu la déclaration en définissant M étend la carte
:
private static <V, E, T extends Iterable<V>> void RunMap( final Map<String, T> results, final Asyncc.IAsyncCallback<Map<String, T>, E> f) {
Une Map
n'est pas une Map
, car vous pouvez invoquer ce code sur cette dernière, mais pas le premier:
final Map<String, ? extends Iterable<V>> results
et vous avez une sécurité de type cassée, car le code utilisant une Map
s'attend à ce que toutes les valeurs soient des ensembles .
Vous devez ajouter une borne au paramètre dans la signature de la méthode:
results.put("", new ArrayList<>());
ce qui empêche la mise en résultats
.
pouvez-vous modifier la méthode
RunMap
?Oui, je peux bien sûr, c'est bien de clarifier cela, merci
J'ai nettoyé un peu la question