public abstract class VarInfoName { public abstract <T extends Object> T accept(Visitor<T> v); public abstract static class Visitor<T extends Object> {} public abstract static class BooleanAndVisitor extends Visitor<Boolean> { private boolean result; public BooleanAndVisitor(VarInfoName name) { //:: error: (argument.type.incompatible) :: warning: (known.nonnull) result = (name.accept(this) != null); } } }