是否存在使用Java Class对象作为键的数据结构的映射,但如果没有找到映射,则使用回退到超类?让我举一个简短的例子:
ClassMap<Integer> map = new ClassMap<Integer>();
map.put(Object.class, 1);
map.put(Number.class, 2);
assertEquals(1, map.get(String.class));
assertEquals(2, map.get(Number.class));
assertEquals(2, map.get(Double.class));
我知道我可以手动执行后备操作,例如
WeakHashMap<Class<?>, Integer> map = // snip
Class<?> cls = Double.class;
Integer i;
do {
i = map.get(cls);
cls = cls.getSuperclass();
} while (i == null && cls != null);
我仍然对现有或替代解决方案感兴趣。
答案 0 :(得分:2)
我无法想到任何能够做出合理工作的其他数据结构。您可能需要自己编写代码。您选择的方法将表现得非常好--O(n),其中n是您将用作键的类的平均继承深度。对于任何合理的类层次结构,N将是常量(并且可能非常小)。任何其他数据结构都不太可能做得更好,或者更容易使用。
IMO更有趣的问题是如何组织自己要编写的代码。一种可能性是将其折叠为自定义Map实现:
public class ClassMap<V> extends HashMap<Class<?>, V> {
@Override
public V get(Object key) {
//use the logic you mentioned in your question here, with super.get(key)
}
}
然后它至少包含在内。