2013-12-25 3 views
2

Для моего проекта у меня есть 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() дает мне подкласс, а не класс, который я хочу.

Как я должен решить эту проблему? Благодаря

+0

Вы можете использовать [Class.isAssignableFrom (класс КНК)] (http://docs.oracle.com/javase/6/docs /api/java/lang/Class.html#isAssignableFrom%28java.lang.Class%29). –

+2

Вы используете наследование, но вы не хотите, чтобы полиморфизм xD был хорошим .. – nachokk

+0

@ElliottFrisch nice, я не знал об этом :) – nachokk

ответ

0

Спасибо за помощь, ребята, я это сделал:

public void post(Event event, Class<?> type) {} 

this.post(new EntityDamageByEntityEvent(), EntityDamage.class); 
0

Заменить

EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(); 

с

Event event = new Event(); 
+1

Это не скомпилируется. –

+0

@HotLicks ya опечатка мой ошибка. у меня были иерархии назад – Evorlor

2

перебрать подкласса предков, пока вы не найдете кого-то, что находится на карте.

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

Другая идея:

Используйте HashMap<String, MyClass>, где ключ должен быть вставлен с полностью квалифицированным именем класса: SubClass.class.getName(). Во время поиска вы можете использовать Class.forName(key), чтобы найти нужный класс.

Смежные вопросы