Вопрос

Я хочу сделать карту контейнера, который имеет следующий интерфейс:

public <T> Thing<T> get(Class<T> clazz);
public <T> void put(Class<T> clazz, Thing<T> thing);

Интересный момент в том, что TS в каждом Class<T> -> Thing<T> пара одинакова T, но контейнер должен иметь возможность удерживать много разных типов пар. Первоначально я попробовал (хэш)карта. Отказ Но, например,

Map<Class<T>, Thing<T>>

не прав, потому что тогда T будет одинаковым T для все Пары в этой карте. Конечно,

Map<Class<?>, Thing<?>>

работает, но потом у меня нет гарантий типа безопасности, чтобы при этом, когда я get(String.class), Я не могу быть уверен, что я получаю Thing<String> экземпляр назад.

Есть ли очевидный способ достичь такого типа безопасности, которую я ищу?

Это было полезно?

Решение

Сама карта не гарантирует, что, но если вы доступа к нему только через вышеупомянутые методы, у вас будет желаемая безопасность.

Другие советы

Если вы хотите иметь возможность поставить разные типы, если вы не должны объявлять два параметра типа?

public <K, V> Thing<V> get(Class<K> clazz);
public <K, V> void put(Class<K> clazz, Thing<V> thing);

Или я неправильно понял вопрос?

Редактировать: я вижу, хорошо, если вы хотите, чтобы контейнер, который может удерживать сущности разных типов, нет возможности иметь полный тип безопасности, поскольку когда вы объявляете свой контейнер, вы можете добавить только один тип на контейнер, а затем вы сможете Чтобы поставить объекты, но вы не можете быть уверены, что вы вернетесь. В лучшем случае вы в конечном итоге положите объекты в качестве объекта, а затем делаете экземпляр и отказываются от того, когда вы получите их обратно. Все коллекции имеют эту проблему. Представьте, что у вас есть Collection<T extends Thing>. Отказ Вы можете поставить в нее вещи, детские затылки или внуки, но когда вы получите его обратно, вы только гарантия, что это вещь, вы не можете сказать, если это ребенок или внук, не тестируя его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top