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