作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个以 JSON 格式存在的异构 map ,我想解析它并将其转换为异构 map 对象(类 HeterogeneousMap
)。
为了解析 map ,我使用一个对象来定义 map 可以拥有的所有已知键(类 HeterogeneousMapStructure
)。
MapKey<T>
接口(interface)有方法T parseValue(JsonReader jsonReader)
解析键的值。
我遇到的问题是如何将解析的值放入类型安全的异构映射对象中:
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;
}
}
有办法解决这个问题吗?
最佳答案
您可以为此创建一个单独的方法:
private static <T> void parseAndPut(HeterogeneousMap map, MapKey<T> key, JsonReader in) throws IOException {
map.put(key, key.parseValue(in));
}
并在解析映射中调用此方法:
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));
}
}
这应该可行,但我没有你的所有类(class),所以我无法真正测试它们。如果他们出了问题,请告诉我,我会尽力修复。
<小时/>问题出在类型通配符上,或者如果你能理解就说存在类型。 Java 对这些通配符的处理相当愚蠢。编译器将任何两个通配符视为可能的不同类型,即使它可以推断它们是相同的类型或者它们位于相同的类型层次结构中。在您的情况下,两个 capture#X-of ?
被认为不相关,因此会引发编译错误。
由于问题是由于编译器无法推断造成的,因此我们明确地告诉它。正如您所看到的,我提取了该操作并将存在类型分配为类型变量(T
),因此编译器现在可以看到类型匹配,问题就解决了。
关于java - 解析异构图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42736059/
我是一名优秀的程序员,十分优秀!