数据结构在考虑超类时将类对象映射到值?

时间:2012-03-20 11:00:32

标签: java

是否存在使用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);

我仍然对现有或替代解决方案感兴趣。

1 个答案:

答案 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)
    }
}

然后它至少包含在内。