import java.util.List; class Test { interface Function<X, Y> { Y m(X x); } interface Node<E> { List<E> foo(); } class Data<T, I> { Data(I state, Function<I, List<T>> fun) { } } <O> Data<O, Node<O>> test(Node<O> collection) { return new Data<>(collection, Node::foo); } }