Нет прямой поддержки этого поведения.
Если в кеше содержатся отдельные элементы, вы можете использовать Class.cast()
, в случае несоответствия выдается ClassCastException
:
private Map<Integer, ?> cache = ...;
public <T> T get(Integer id, Class<T> c) {
return c.cast(cache.get(id));
}
В случае кэшированных коллекций это будет более сложным. Если вы действительно хотите избежать неконтролируемого приведения, вы можете создать новую коллекцию и заполнить ее с помощью Class.cast()
:
Collection<T> result = ...;
for (Object o: theCache.get(index))
result.add(theClass.cast(o));
return result;
Другие подходы включают, например, создание «проверенного» представления коллекции с использованием Collections2.transform()
:
в Guava
public class Cast<T> implements Function<Object, T> {
private Class<T> type;
public Cast(Class<T> type) {
this.type = type;
}
public T apply(Object in) {
return type.cast(in);
}
}
.
return Collections2.transform(theCache.get(index), new Cast<T>(theClass));