I would like to link generic type from argument and result in a Function. Here is a simple example :
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());
I don't want to do cast because it is obvious that my function returns what is in the list. I would like to write something like this :
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);
}
Is there any way to achieve that ?
Thanks in advance
Edit : Some people asked a more real code. I try to create an iterator on a list of list, but I want my sub lists are loading only when needing. I would like to make a generic method to be called by my own ListIterator::next and previous.
Here is a more concrete code :
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();
}
}
This code compiles and potentially works but I would like to do that without both casts in get method (into 'String' and 'List').