Безопасное отображение типа из класса <T>в Thing <T> - PullRequest
4 голосов
/ 09 июня 2010

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

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

Интересно то, что T s в каждой паре Class<T> -> Thing<T>то же самое T, но контейнер должен содержать много разных типов пар.Сначала я попробовал (Hash) Map .Но, например,

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 09 июня 2010

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

2 голосов
/ 09 июня 2010

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

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, без фактического тестирования.

...