Casting
,
instanceof
和
@SuppressWarnings("unchecked")
噪音很大。把它们塞进一个不需要被关注的方法中会很好。
CheckedCast.castToMapOf()
是一种尝试。
castToMapOf()
正在进行一些假设:
(1) 、(2)和(3)是我工作环境的症状,超出了我的控制范围。(4) 和(5)是我做出的妥协,因为我还没有找到克服它们的好方法。
(4) 很难克服,因为即使
HashMap.class
被传递到
Class<M>
我还不知道如何返回
M<K, V>
。所以我返回
Map<K, V>
.
(5) 可能是使用的固有限制
Class<T>
。我很想听听其他想法。
尽管有这些限制,你能看到这个代码有什么问题吗?我是否做出了任何我尚未确定的假设?有更好的方法吗?如果我正在重新发明轮子,请指向轮子。:)
public class CheckedCast {
public static final String LS = System.getProperty("line.separator");
public static <K, V> Map<K, V> castToMapOf(
Class<K> clazzK,
Class<V> clazzV,
Map<?, ?> map) {
for ( Map.Entry<?, ?> e: map.entrySet() ) {
checkCast( clazzK, e.getKey() );
checkCast( clazzV, e.getValue() );
}
@SuppressWarnings("unchecked")
Map<K, V> result = (Map<K, V>) map;
return result;
}
public static <T> void checkCast(Class<T> clazz, Object obj) {
if ( !clazz.isInstance(obj) ) {
throw new ClassCastException(
LS + "Expected: " + clazz.getName() +
LS + "Was: " + obj.getClass().getName() +
LS + "Value: " + obj
);
}
}
public static void main(String[] args) {
Map heterogeneousMap = new HashMap();
heterogeneousMap.put("Hmm", "Well");
heterogeneousMap.put(1, 2);
Map homogeneousMap = new HashMap();
homogeneousMap.put("Hmm", "Well");
@SuppressWarnings("unchecked")
Map<String, String> simpleCastOfHeteroMap =
(Map<String, String>) heterogeneousMap;
@SuppressWarnings("unchecked")
Map<String, String> simpleCastOfHomoMap =
(Map<String, String>) homogeneousMap;
Map<String, String> checkedCastOfHomoMap =
castToMapOf(String.class, String.class, homogeneousMap);
Map<String, String> checkedCastOfHeteroMap =
castToMapOf(String.class, String.class, heterogeneousMap);
}
}
我发现一些阅读很有用:
Generic factory with unknown implementation classes
Generic And Parameterized Types
我也想知道
TypeReference
/
super type tokens
可能有助于(4)和(5),并且是解决这个问题的更好方法。如果你这么认为,请发布一个例子。