Есть ли способ избежать передачи конструктором класса?

Рассмотрим это расширение HashMap ( генерирует экземпляр класса V при вызове "get", если он равен нулю)

public class HashMapSafe<K, V> extends HashMap<K, V> implements Map<K, V>{

    private Class<V> dataType;

    public HashMapSafe(Class<V> clazz){
        dataType = clazz;
    }
    @SuppressWarnings("unchecked")
    @Override
    public V get(Object key) {
        if(!containsKey(key)){
            try {
                put((K)key, dataType.newInstance());
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return super.get(key);
    }
}

Его используют примерно так

Map<String,Section> sections = new HashMapSafe<String,Section>(Section.class);
sections.get(sectionName); //always returns a Section instance, existing or new

Мне кажется излишним указывать "Section" дважды, один раз как общий тип, а также поставьте его класс. Я предполагаю, что это невозможно, но можно ли реализовать HashMapSafe (с сохранением той же функциональности), чтобы его можно было использовать вот так?

Map<String,Section> sections = new HashMapSafe<String,Section>();

Или вот так ?:

Map<String,Section> sections = new HashMapSafe<String>(Section.class);
6
задан Eran Medan 3 April 2011 в 03:15
поделиться