Несовместимые общие подстановочные знаки - PullRequest
3 голосов
/ 16 декабря 2010

в следующем фрагменте:

package test;

import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

public class WildcardsTest<K, V> {
    private Iterator<Map.Entry<K, ? extends Collection<V>>> iterator;
    public WildcardsTest(Map<K, ? extends Collection<V>> map) {
        iterator = map.entrySet().iterator();
        /* Type mismatch: cannot convert from
           Iterator<Map.Entry<K,capture#1-of ? extends Collection<V>>> to
           Iterator<Map.Entry<K,? extends Collection<V>>> */
    }
}

Назначение неверно, хотя типы, похоже, точно совпадают.

Я разработал грязный обходной путь, указав тип Коллекции в качестве другого универсального параметра, например:

public class WildcardsTest<K, V, C extends Collection<V>> {
    private Iterator<Map.Entry<K, C>> iterator;
    public WildcardsTest(Map<K, C> map) {
        iterator = map.entrySet().iterator();
    }
}

Но этот параметр C на самом деле является типом "все равно", который только усложняет API, есть ли способ избавиться от него при сохранении безопасности типов?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 16 декабря 2010

Сделайте так, и это будет работать:

private final Iterator<? extends
    Map.Entry<K, ? extends Collection<V>>
> iterator;

Вы все еще можете использовать итератор следующим образом:

public void foo(){
    while(iterator.hasNext()){
        Entry<K, ? extends Collection<V>> entry = iterator.next();
        Collection<V> value = entry.getValue();
    }
}

Для справки прочитайте принцип получения и сдачи (первоначально из Обобщения и коллекции Java )

2 голосов
/ 16 декабря 2010

Назначение неверно, хотя типы, похоже, точно совпадают.

Две карточки ? могут быть связаны с двумя разными классами. Проще говоря, совершенно очевидно, что существует несоответствие типов:

private Iterator<Map.Entry<K, ArrayList<V>>> iterator;
public WildcardsTest(Map<K, HashSet<V>> map) {
    iterator = map.entrySet().iterator();
}

Когда вы вводите C, вы «заставляете их» ссылаться на тот же класс.

...