К сожалению, это не возможно с обобщениями Java. Если бы Java допускала параметры типа более высокого порядка , то можно было бы определить Map
что-то вроде:
public interface Map<V<>> { // here V<> is my hypothetical syntax for a
// type parameter which is itself generic...
<K>
V<K> put(K key, V<K> value);
...
}
вместо фактического java.util.Map
:
public interface Map<K, V> {
V put(K key, V value);
...
}
Вы видите, что проблема в том, что K
объявляется один раз для всего класса, а не для каждого вызова .put()
.
Хватит фантазировать, так что вы можете сделать? Я думаю, что лучше всего создать Map<Set<?>, Object>
и обернуть его в качестве частного участника. Тогда вы можете создавать свои собственные put()
и get()
, которые принимают во внимание предполагаемое «отношение» между типами:
class SpecialMap {
private Map<Set<?>, Object> map = ...;
public <T>
T put(Set<T> key, T value) {
return (T) map.put(key, value);
}
public <T>
T get(Set<T> key) {
return (T) map.get(key);
}
}