【问题标题】:Incompatible generic wildcard captures不兼容的通用通配符捕获
【发布时间】:2010-12-16 10:15:37
【问题描述】:

在下面的sn-p中:

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>>> */
    }
}

分配不正确,尽管类型似乎完全匹配。

我通过将 Collection 的类型指定为另一个通用参数来设计一个肮脏的解决方法,如下所示:

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 复杂化,有没有办法在保持类型安全的同时摆脱它?

谢谢。

【问题讨论】:

    标签: java generics wildcard capture


    【解决方案1】:

    这样做,它会工作:

    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();
        }
    }
    

    供参考,阅读the get and put principle(原文来自Java Generics and Collections

    【讨论】:

    • 太棒了!再一次,解决方案是另一个级别的间接 xD
    【解决方案2】:

    分配不正确,尽管类型似乎完全匹配。

    两个?-wildcard 可以绑定到两个不同的类。这么说来,很明显是类型不匹配:

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

    当你介绍C 时,你“强迫他们”引用同一个类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多