Я хотел бы связать универсальный тип из аргумента и привести к функции.
Вот простой пример:
private void take(final Function<ListIterator<?>, ?> takeFunction) {
final ListIterator<String> stringItr = new ArrayList<String>().listIterator();
final ListIterator<Integer> intItr = new ArrayList<Integer>().listIterator();
final String string = (String) takeFunction.apply(stringItr);
final Integer integer = (Integer) takeFunction.apply(intItr);
}
take(itr -> itr.next());
take(itr -> itr.previous());
Я не хочу выполнять приведение, потому что очевидно, что моя функция возвращает то, что находится в списке. Я хотел бы написать что-то вроде этого:
private void take(final Function<ListIterator<T>, T> takeFunction) {
final ListIterator<String> stringItr = new ArrayList<String>().listIterator();
final ListIterator<Integer> intItr = new ArrayList<Integer>().listIterator();
final String string = takeFunction.apply(stringItr);
final Integer integer = takeFunction.apply(intItr);
}
Есть ли способ достичь этого?
Заранее спасибо
Редактировать:
Некоторые люди спрашивают более реальный код.
Я пытаюсь создать итератор в списке списка, но я хочу, чтобы мои подсписки загружались только при необходимости.
Я хотел бы сделать общий метод, который будет вызываться моим собственным ListIterator :: next и previous.
Вот более конкретный код:
List<List<String>> lists;
ListIterator<List<String>> curListsIter;
ListIterator<String> curStringIter;
@Override
public String next() {
return get(
listIterator -> listIterator.hasNext(),
listIterator -> listIterator.next(),
list -> list.listIterator());
}
@Override
public String previous() {
return get(
listIterator -> listIterator.hasPrevious(),
listIterator -> listIterator.previous(),
list -> list.listIterator(list.size()));
}
private String get(final Function<ListIterator<?>, Boolean> has,
final Function<ListIterator<?>, ?> item,
final Function<List<String>, ListIterator<String>> iterator) {
// The current sub list has an item to get
if (has.apply(curStringIter)) {
return (String) item.apply(curStringIter);
}
// There is a list in the direction
else if (has.apply(curListsIter)) {
curStringIter = iterator.apply(
(List<String>) item.apply(curListsIter));
return get(has, item, iterator);
}
// No more item in sub list nor list
else {
throw new NoSuchElementException();
}
}
Этот код компилируется и потенциально работает, но я хотел бы сделать это без обоих приведений в методе get (в 'String' и 'List').