首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析异构映射

解析异构映射
EN

Stack Overflow用户
提问于 2017-03-11 13:55:22
回答 1查看 550关注 0票数 0

我有一个以JSON格式存在的异构映射,我希望解析它并将它转换为异构映射对象(类HeterogeneousMap)。

为了解析映射,我使用了一个对象,它定义了映射可以拥有的所有已知键(类HeterogeneousMapStructure)。

MapKey<T>接口具有解析键值的方法T parseValue(JsonReader jsonReader)

我面临的问题是如何将解析的值放入类型安全的异构映射对象中:

代码语言:javascript
复制
public class HeterogeneousMap {
    public <T> void put(MapKey<T> mapKey, T value) {
        // Put key and value in map
    }
}

public interface MapKey<T> {
    T parseValue(JsonReader jsonReader) throws IOException;
}

public class HeterogeneousMapStructure {
    private final List<MapKey<?>> keyList;

    public HeterogeneousMap parseMap(JsonReader jsonReader) {
        HeterogeneousMap heterogeneousMap = new HeterogeneousMap();

        // ... find matching key
        MapKey<?> matchingMapKey = ...;
        /*
         * Compiling error:
         * The method put(TestClass.MapKey<T>, T) in the type TestClass.HeterogeneousMap 
         * is not applicable for the arguments (TestClass.MapKey<capture#1-of ?>, capture#2-of ?)
         */
        heterogeneousMap.put(matchingMapKey, matchingMapKey.parseValue(jsonReader));

        return heterogeneousMap;
    }
}

有办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-11 14:35:06

有个解决办法。

您可以为此创建一个单独的方法:

代码语言:javascript
复制
private static <T> void parseAndPut(HeterogeneousMap map, MapKey<T> key, JsonReader in) throws IOException {
    map.put(key, key.parseValue(in));
}

并在解析映射中调用此方法:

代码语言:javascript
复制
public class HeterogeneousMapStructure {
    private final List<MapKey<?>> keyList;

    public HeterogeneousMap parseMap(JsonReader jsonReader) {
        HeterogeneousMap heterogeneousMap = new HeterogeneousMap();

        // ... find matching key
        MapKey<?> matchingMapKey = ...;
        /*
         * Compiling error:
         * The method put(TestClass.MapKey<T>, T) in the type TestClass.HeterogeneousMap 
         * is not applicable for the arguments (TestClass.MapKey<capture#1-of ?>, capture#2-of ?)
         */
        parseAndPut(heterogeneousMap, matchingMapKey, jsonReader);

        return heterogeneousMap;
    }

    private static <T> void parseAndPut(HeterogeneousMap map, MapKey<T> key, JsonReader in) throws IOException {
        map.put(key, key.parseValue(in));
    }
}

这应该可以用,但我没有你所有的课程,所以我不能真正测试它们。如果他们出了什么问题,告诉我,我会尽力解决的。

我是怎么想出这个解决方案的

问题在于类型通配符,或者说存在类型,如果你能理解。Java使用这些通配符非常愚蠢。编译器将任意两个通配符视为可能的不同类型,即使它可以推断它们是相同的类型,或者它们处于相同的类型层次结构中。在您的示例中,两个capture#X-of ?被认为不相关,因此会引发编译错误。

由于问题是由于编译器无法推断,所以我们显式地告诉它。如您所见,我提取操作并将存在类型指定为类型变量(T),因此编译器现在将能够看到类型匹配,问题就解决了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42736059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档