【问题标题】:Argument conversion with Iterables, Maps, Objects and?使用 Iterables、Maps、Objects 和?
【发布时间】:2015-04-19 17:37:54
【问题描述】:

我有一个类型的变量:

Iterable<Map<String,Object>>

我正在尝试将其作为类型返回:

Iterable<Map<String,?>>

编译器说:

argument mismatch; Iterable<Map<String,Object>>
cannot be converted to Iterable<Map<String,?>>

有谁知道如何强制编译器在这里“做正确的事情”,或者这在某种程度上是不可能的?

【问题讨论】:

  • 可以更改返回类型吗?

标签: java generics iterator type-conversion


【解决方案1】:

Iterable&lt;T&gt; 应该是Iterator&lt;T&gt; 的“生产者”,而Iterator&lt;T&gt; 又是其类型参数T 的“生产者”(只有返回T 的方法,没有采用@ 的方法987654325@)。因此,根据 PECS(生产者extends,消费者super)规则,它应该始终与extends 通配符一起使用。

如果你有一个类型的变量

Iterable<? extends Map<String,Object>>

然后您将其返回为

Iterable<? extends Map<String,?>>

没有问题。每当您从中得到Iterator 时,您将类似地键入Iterator&lt;? extends Something&gt;

【讨论】:

    【解决方案2】:

    如果您不想使用仅转换为原始类型的大棒方法(这可能会导致悲伤 - 请参阅 What is a raw type and why shouldn't we use it?),您可以始终使用不需要转换的瘦适配器,从而保持所有可能的类型安全:

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

    【讨论】:

      【解决方案3】:

      您始终可以转换为无类型的 Iterable,并让 return 语句执行未经检查的转换回您想要的类型:

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

      【讨论】:

        猜你喜欢
        • 2021-06-19
        • 2015-12-05
        • 2010-09-07
        • 2016-06-16
        • 2020-08-29
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        相关资源
        最近更新 更多