Если вы хотите иметь возможность добавлять разные типы, разве вы не должны объявлять два параметра типа?
public <K, V> Thing<V> get(Class<K> clazz);
public <K, V> void put(Class<K> clazz, Thing<V> thing);
или я неправильно понял вопрос?
Редактировать: Понятно, хорошоесли вы хотите o контейнер, который может содержать объекты разных типов, вы никак не можете обеспечить полную безопасность типов, так как, когда вы объявляете свой контейнер, вы можете поместить в контейнер только один тип, и тогда вы сможете помещать объекты, ноты не можешь быть уверен, что получишь обратно.В лучшем случае вы в конечном итоге добавляете объекты как Object, а затем выполняете instanceof и приводите их при получении.Все коллекции имеют эту проблему.Представьте, что у вас есть Collection<T extends Thing>
.Вы можете поместить в него Things, ChildOfThings или GrandChildOfThings, но когда вы получите его обратно, вы гарантируете только то, что это Thing, вы не сможете определить, является ли он Child или GrandChild, без фактического тестирования.