【问题标题】:Comparing class types with inheritance比较类类型与继承
【发布时间】:2013-12-25 20:40:32
【问题描述】:

对于我的项目,我有一个 HashMap,其中 Class<?> 作为键,MyClass 作为值。

Map<Class<?>, MyClass> map = new HashMap<Class<?>, MyClass>();

作为一个例子,我输入了一些值:

map.put(EntityDamageEvent.getClass(), new MyClass());

这是这个键的继承树:

class EntityDamageByEntityEvent extends EntityDamageEvent
class EntityDamageEvent extends EntityEvent
class EntityEvent extends Event

当我尝试从映射中获取值时出现问题,但键恰好是我实际尝试使用的键的子类:

void doSomething() {
    EntityDamageByEntityEvent event = new EntityDamageByEntityEvent();

    post(event); //This returns null
}

MyClass post(Event event) {
    return map.get(event.getClass());
}

Object.getclass() 给了我子类,而不是我想要的类。

我应该如何解决这个问题?谢谢

【问题讨论】:

  • 你使用继承,但你不想要多态性 xD nice..
  • @ElliottFrisch 很好,我不知道 :)
  • getClass 只会为您提供实际对象的实际类。
  • 你应该重新考虑你的设计。正如已经指出的那样,这就是它的工作方式。

标签: java class inheritance


【解决方案1】:

遍历子类祖先,直到找到地图中的某个人。

for (Class<T> klass = event.getClass(); klass!=null; klass=klass.getSuperclass()) {
 MyClass c = map.get(klass);
 if (c!=null) return c;
}
return null;

【讨论】:

    【解决方案2】:

    替换

    EntityDamageByEntityEvent event = new EntityDamageByEntityEvent();
    

    Event event = new Event();
    

    【讨论】:

    • @HotLicks 是我的错字。让我的层次结构向后
    【解决方案3】:

    一个不同的想法:

    使用HashMap&lt;String, MyClass&gt; 和类的完全限定名称:SubClass.class.getName()。检索时,您可以使用Class.forName(key) 查找正确的类。

    【讨论】:

      【解决方案4】:

      感谢大家的帮助,我已经做到了:

      public void post(Event event, Class<?> type) {}
      
      this.post(new EntityDamageByEntityEvent(), EntityDamage.class);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多