Если вы отбрасываете проверку во время компиляции в пользу проверки во время выполнения, вам понадобятся объекты типа времени выполнения из двух источников для проведения каких-либо сравнений.
Итак, самое простое - указать Class
объект с обоих концов.В простом случае.
<T> void put(Class<T> t, T object);
<T> T get(Class<T> t);
Добавление определенного типа с двумя параметрами (в Java нет типов с более высоким родом), двух типов и ключа (свысока для строкового программирования).
<K,V> void put(Class<K> k, Class<V> v, Key key, My<K,V> object);
<K,V> My<K,V> get(Class<K> k, Class<V> v, Key key);
Существует возможность объединить три ключевых объекта в один.
public final class MyKey<K,V> {
public static of(Class<K> k, Class<V> v, SimpleKey key) {
....
}
...
}
<K,V> void put(MyKey<K,V> key, My<K,V> object);
<K,V> My<K,V> get(MyKey<K,V> key);
Кроме того, вы можете искать другой источник объектов класса.Они доступны из сигнатур методов.
public interface MyReceiver<K,V> {
void accept(My<K,V> object);
}
/** @param receiver Runtime type should specialise type parameters. */
void get(MyReceiver<?,?> receiver);
(MyReciever<?,?>
может быть стандартным Consumer<? extends MyReciever<?,?>>
.)
Вы можете добавить дополнительный простой ключ в качестве параметра к get
(лямбда-дружественный), метод на MyReceiver
, аннотация на accept
или MyReceiver
, или отбросьте метод с MyReceiver
и используйте любой тип среды выполнения, используемый в качестве имени метода (возможно, аннотированный, чтобы найти, какой метод выхочу).
Фактически этот подход , указывающий требуемые типы в интерфейсах, является более современным, чем разнородные карты старой школы .
(Обратите внимание, что "хранилище" - этостандартный срок для вашего склада.)