С Андреем все в порядке, но большинство программистов, скорее всего, будут бороться с довольно неизвестным синтаксисом.Может быть проще использовать этот способ:
static public <K3> Builder<K3> start(Class<K3> cls) { return new Builder<K3>(); }
Foo<Bar> foo1 = Foo.Builder.start(Bar.class).setCount(1).setKey(bar).build();
Класс передается только для помощи с универсальным типом.Это не красиво, но, по крайней мере, синтаксис общеизвестен.
Другой вариант - сразу начать с объекта общего типа:
Foo<Bar> foo1 = Foo.Builder.startWithKey(bar).setCount(1).build();