Проблема: у меня есть интерфейс Function Object, определенный в классе:
public static interface FunctionObject<T> {
void process(T object);
}
Мне нужен универсальный интерфейс, потому что я хотел бы использовать методы T в реализациях процесса.
Затем,в другом универсальном классе у меня есть карта, где у меня есть классы в качестве ключей и функциональные объекты в качестве значений:
Map<Class<T>, FunctionObject<T>> map;
Но я также хочу, чтобы карта принимала классы подтипов и функциональные объекты супертипов типа KEY, поэтому я сделал это:
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, чтобы можно было заполнять их из ссылки?