解析异构图
Parsing heterogeneous map
我有一个以 JSON 格式存在的异构地图,我想解析它并将其转换为异构地图对象 (class HeterogeneousMap
)。
为了解析地图,我使用了一个对象,该对象定义了地图可以拥有的所有已知键 (class HeterogeneousMapStructure
)。
MapKey<T>
接口有方法T parseValue(JsonReader jsonReader)
解析key的值。
我遇到的问题是如何将解析后的值放入类型安全的异构映射对象中:
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));
}
}
这应该可行,但我没有您所有的 类,所以我无法真正测试它们。如果他们有什么问题,请告诉我,我会尽力解决。
我是如何想到这个解决方案的
问题出在类型通配符上,如果能看懂就说存在类型。 Java 对这些通配符非常愚蠢。编译器将任何两个通配符视为可能不同的类型,即使它可以推断它们是同一类型或它们位于同一类型层次结构中。在您的情况下,这两个 capture#X-of ?
被认为是不相关的,因此会引发编译错误。
既然是编译器无法推断的问题,我们就明确的告诉它。如您所见,我提取了操作并将存在类型分配给类型变量 (T
),因此编译器现在能够看到类型匹配,问题就解决了。
我有一个以 JSON 格式存在的异构地图,我想解析它并将其转换为异构地图对象 (class HeterogeneousMap
)。
为了解析地图,我使用了一个对象,该对象定义了地图可以拥有的所有已知键 (class HeterogeneousMapStructure
)。
MapKey<T>
接口有方法T parseValue(JsonReader jsonReader)
解析key的值。
我遇到的问题是如何将解析后的值放入类型安全的异构映射对象中:
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));
}
}
这应该可行,但我没有您所有的 类,所以我无法真正测试它们。如果他们有什么问题,请告诉我,我会尽力解决。
我是如何想到这个解决方案的
问题出在类型通配符上,如果能看懂就说存在类型。 Java 对这些通配符非常愚蠢。编译器将任何两个通配符视为可能不同的类型,即使它可以推断它们是同一类型或它们位于同一类型层次结构中。在您的情况下,这两个 capture#X-of ?
被认为是不相关的,因此会引发编译错误。
既然是编译器无法推断的问题,我们就明确的告诉它。如您所见,我提取了操作并将存在类型分配给类型变量 (T
),因此编译器现在能够看到类型匹配,问题就解决了。