Общие: как наложить ограничения между ключами и значениями на карте

Проблема: у меня есть интерфейс объекта функции, определенный в классе:

    public static interface FunctionObject<T>  {
        void process(T object);
    }

Мне он нужен универсальный, потому что я хотел бы использовать методы T в реализации процессов.
Затем в другом универсальном классе у меня есть карта, где у меня есть классы в качестве ключей и функциональные объекты в качестве значений:

    Map<Class<T>, FunctionObject<T>> map;

Но я также хочу, чтобы карта принимала классы подтипов и функциональные объекты супертипов ТИПА КЛЮЧА, поэтому я сделал это:

    Map<Class<? extends T>, FunctionObject<? super T>> map; //not what I need

Основная идея состоит в том, чтобы иметь возможность использовать карту следующим образом:

    //if T were Number, this should be legal
    map.put(Class<Integer>, new FunctionObject<Integer>(){...});
    map.put(Class<Float>, new FunctionObject<Number>(){...});
    map.put(Class<Double>, new FunctionObject<Object>(){...});

Поскольку я хочу, чтобы объект FunctionObject имел тип ключа класса или супертип, я действительно хотел бы определить следующее:

    Map<Class<E extends T>, FunctionObject<? super E>>> map;

Как добиться желаемого эффекта? Является ли безопасный гетерогенный контейнер единственным вариантом? Как будут выглядеть универсальные типы Map, чтобы их можно было заполнять по ссылке?

7
задан Mister Smith 13 January 2012 в 09:29
поделиться