import java.util.HashMap; import java.util.List; import java.util.Map; class BuilderGeneric<K extends Comparable<K>, V extends List<K>> { private final String foo; private final Map<K, V> bar = $Builder.$barDefault(); @java.lang.SuppressWarnings("all") private BuilderGeneric(final $Builder<K, V> builder) { this.foo = builder.foo; this.bar.putAll(builder.bar); } @java.lang.SuppressWarnings("all") public static <K extends Comparable<K>, V extends List<K>> FooDef<K, V> builderGeneric() { return new $Builder<K, V>(); } @java.lang.SuppressWarnings("all") public static interface FooDef<K extends Comparable<K>, V extends List<K>> { OptionalDef<K, V> foo(final String foo); @java.lang.SuppressWarnings("all") OptionalDef<K, V> foo(final Class<?> clazz); } @java.lang.SuppressWarnings("all") public static interface OptionalDef<K extends Comparable<K>, V extends List<K>> { OptionalDef<K, V> bar(final K arg0, final V arg1); OptionalDef<K, V> bar(final java.util.Map<? extends K, ? extends V> arg0); BuilderGeneric<K, V> build(); } @java.lang.SuppressWarnings("all") private static class $Builder<K extends Comparable<K>, V extends List<K>> implements FooDef<K, V>, OptionalDef<K, V> { private String foo; private Map<K, V> bar = $barDefault(); static <K extends Comparable<K>, V extends List<K>> Map<K, V> $barDefault() { return new HashMap<K, V>(); } public OptionalDef<K, V> foo(final String foo) { this.foo = foo; return this; } public OptionalDef<K, V> bar(final K arg0, final V arg1) { this.bar.put(arg0, arg1); return this; } public OptionalDef<K, V> bar(final java.util.Map<? extends K, ? extends V> arg0) { this.bar.putAll(arg0); return this; } public BuilderGeneric<K, V> build() { return new BuilderGeneric<K, V>(this); } private $Builder() { } @java.lang.SuppressWarnings("all") public OptionalDef<K, V> foo(final Class<?> clazz) { this.foo = clazz.getSimpleName(); return this; } } } class DomainContainer<D> { private final int a; private final D domain; @java.lang.SuppressWarnings("all") private DomainContainer(final $Builder<D> builder) { this.a = builder.a; this.domain = builder.domain; } @java.lang.SuppressWarnings("all") public static <D> ADef<D> domainContainer() { return new $Builder<D>(); } @java.lang.SuppressWarnings("all") public static interface ADef<D> { DomainDef<D> a(final int a); } @java.lang.SuppressWarnings("all") public static interface DomainDef<D> { OptionalDef<D> domain(final D domain); } @java.lang.SuppressWarnings("all") public static interface OptionalDef<D> { DomainContainer<D> build(); } @java.lang.SuppressWarnings("all") private static class $Builder<D> implements ADef<D>, DomainDef<D>, OptionalDef<D> { private int a; private D domain; public DomainDef<D> a(final int a) { this.a = a; return this; } public OptionalDef<D> domain(final D domain) { this.domain = domain; return this; } public DomainContainer<D> build() { return new DomainContainer<D>(this); } private $Builder() { } } }