Java 使用Iterables、映射、对象和?

Java 使用Iterables、映射、对象和?,java,generics,iterator,type-conversion,Java,Generics,Iterator,Type Conversion,我有一个类型为的变量: Iterable<Map<String,Object>> Iterable 我试图将其作为类型返回: Iterable<Map<String,?>> Iterable 编者说: argument mismatch; Iterable<Map<String,Object>> cannot be converted to Iterable<Map<String,?>> 参

我有一个类型为的变量:

Iterable<Map<String,Object>>
Iterable
我试图将其作为类型返回:

Iterable<Map<String,?>>
Iterable
编者说:

argument mismatch; Iterable<Map<String,Object>>
cannot be converted to Iterable<Map<String,?>>
参数不匹配;可迭代的
无法转换为Iterable

有人知道如何强制编译器在这里“做正确的事情”吗?或者这是不可能的吗?

您总是可以强制转换为非类型化的Iterable,并让return语句执行未经检查的强制转换回您想要的类型:

public static Iterable<Map<String, ?>> getIt() {
    Iterable<Map<String, Object>> t = null;
    return ((Iterable) t);
}
publicstaticiterable getIt(){
Iterable t=null;
返回((Iterable)t);
}

如果您不想使用仅铸造原始类型的棍棒法(这可能会导致悲伤-请参阅),您可以始终使用薄适配器,无需铸造,从而保持所有可能的类型安全:

// Could probably be done inline with a little tweaking.
class IMSQ implements Iterable<Map<String, ?>> {

    // The adaptee.
    final Iterable<Map<String, Object>> o;

    public IMSQ(Iterable<Map<String, Object>> o) {
        this.o = o;
    }

    @Override
    public Iterator<Map<String, ?>> iterator() {
        // Pull a new Iterator out of it.
        final Iterator<Map<String, Object>> it = o.iterator();
        // Wrap it.
        return new Iterator<Map<String, ?>>() {

            @Override
            public boolean hasNext() {
                return it.hasNext();
            }

            @Override
            public Map<String, ?> next() {
                return it.next();
            }

        };
    }

}
//可能只需稍加调整即可内联完成。
类IMSQ实现了Iterable{
//被改编者。
最终的ITEO;
公共IMSQ(ITEO){
这个。o=o;
}
@凌驾
公共迭代器迭代器(){
//从中拉出一个新的迭代器。
最终迭代器it=o.Iterator();
//把它包起来。
返回新的迭代器(){
@凌驾
公共布尔hasNext(){
返回它。hasNext();
}
@凌驾
公共地图下一页(){
返回它。下一步();
}
};
}
}
Iterable
应该是
迭代器的“生产者”,迭代器反过来是其类型参数
T
的“生产者”(只有一个方法返回
T
,没有方法接受
T
)。因此,根据PECS(生产者
扩展
,消费者
超级
)规则,它应始终与
扩展
通配符一起使用

如果您有一个类型为的变量

Iterable<? extends Map<String,Object>>
Iterable>

没问题。每当您从中获得
Iterator
时,您将类似地将其键入为
Iterator。您可以更改返回类型吗?
Iterable<? extends Map<String,?>>