Я хочу написать безопасный для типа метод map
в Java, который возвращает коллекцию того же типа, что и передаваемый аргумент (т.е. ArrayList, LinkedList, TreeSet и т. Д.), Но с другим универсальным типом (который междуугловые скобки), определяемые универсальным типом другого параметра (результирующий тип универсальной функции отображения).
Таким образом, код будет использоваться как:
public interface TransformFunctor<S, R> {
public R apply(S sourceObject);
}
TransformFunctor i2s = new TransformFunctor<Integer, String>() {
String apply(Integer i) {return i.toString();};
ArrayList<Integer> ali = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4));
ArrayList<String> als = map(ali, i2s);
TreeSet<Integer> tsi = new TreeSet<Integer>(Arrays.asList(1, 2, 3, 4));
TreeSet<String> tss = map(tsi, i2s);
Идея будетчто-то вроде:
public static <C extends Collection<?>, S, R>
C<R> map(final C<S> collection, final TransformFunctor<S, R> f)
throws Exception {
//if this casting can be removed, the better
C<R> result = (C<R>) collection.getClass().newInstance();
for (S i : collection) {
result.add(f.apply(i));
}
return result;
}
, но это не работает, потому что компилятор не ожидает, что переменные универсального типа станут более специализированными (я думаю).
Любая идея о том, как это сделатьработа