import java.util.Map; abstract class Test<Tt> { public Map<String, Long> getNumberOfInstancesForEachWord() { return collect(groupingBy(counting())); } abstract <R> R collect(Collector<? super Tt, R> collector); abstract <Tg, M> Collector<Tg, M> groupingBy(Collector<? super Tg, Long> downstream); abstract <Tc> Collector<Tc, Long> counting(); interface Collector<T, R> {} } abstract class Test1<Tt> { public Map<String, Long> getNumberOfInstancesForEachWord() { return collect(groupingBy(counting())); } abstract <R> R collect(Collector<Tt, R> collector); abstract <Tg, M> Collector<Tg, M> groupingBy(Collector<Tg, Long> downstream); abstract <Tc> Collector<Tc, Long> counting(); interface Collector<T, R> {} } abstract class Test2<Tt> { public Map<String, Long> getNumberOfInstancesForEachWord() { return collect(groupingBy(counting())); } abstract <R> R collect(Collector<Tt, R> collector); abstract <Tg, M> Collector<Tg, M> groupingBy(Collector<? extends Tg, Long> downstream); abstract <Tc> Collector<Tc, Long> counting(); interface Collector<T, R> {} }