Проблема: у меня есть интерфейс объекта функции, определенный в классе:
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, чтобы их можно было заполнять по ссылке?