import java.util.*; import java.lang.annotation.Annotation; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; abstract class WithAnn { { map((Class<? extends Annotation> ann) -> getAnnotation(ann)); map(this::getAnnotation); } abstract <A> A getAnnotation(Class<A> annotationClass); abstract <R> void map(Function<Class<? extends Annotation>, ? extends R> mapper); } class Test { private void it(final Set<Class<? extends String>> set) { set.forEach((clazz) -> bind(clazz)); } protected <T> void bind(Class<T> clazz) {} }