2
votes

Caster défini sur Iterable

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 , je pensais qu'Iterable ferait ça mais apparemment pas?

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 commentaires

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


3 Réponses :


0
votes

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) {

    }


2 commentaires

J'ai essayé ça, j'obtiens ce problème Mauvais 2ème type d'argument. Trouvé: 'java.util.HashSet ', requis: '? étend java.lang.Iterable '


@AlexanderMills, vous devez passer de RunMap ((Map >) résultats, f); à ce RunMap (résultats, f); supprimer casting, ça marche bien



2
votes

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 , E> .

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) {


0 commentaires

2
votes

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 .


0 commentaires