import java.util.Set; public class BuilderWithRecursiveGenerics { interface Inter<T, U extends Inter<T, U>> { } public static final class Test<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> { private final Foo foo; private final Bar bar; @java.lang.SuppressWarnings("all") Test(final Foo foo, final Bar bar) { this.foo = foo; this.bar = bar; } @java.lang.SuppressWarnings("all") public static class TestBuilder<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> { @java.lang.SuppressWarnings("all") private Foo foo; @java.lang.SuppressWarnings("all") private Bar bar; @java.lang.SuppressWarnings("all") TestBuilder() { } /** * @return {@code this}. */ @java.lang.SuppressWarnings("all") public BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz> foo(final Foo foo) { this.foo = foo; return this; } /** * @return {@code this}. */ @java.lang.SuppressWarnings("all") public BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz> bar(final Bar bar) { this.bar = bar; return this; } @java.lang.SuppressWarnings("all") public BuilderWithRecursiveGenerics.Test<Foo, Bar, Quz> build() { return new BuilderWithRecursiveGenerics.Test<Foo, Bar, Quz>(this.foo, this.bar); } @java.lang.Override @java.lang.SuppressWarnings("all") public java.lang.String toString() { return "BuilderWithRecursiveGenerics.Test.TestBuilder(foo=" + this.foo + ", bar=" + this.bar + ")"; } } @java.lang.SuppressWarnings("all") public static <Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz> builder() { return new BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz>(); } @java.lang.SuppressWarnings("all") public Foo getFoo() { return this.foo; } @java.lang.SuppressWarnings("all") public Bar getBar() { return this.bar; } @java.lang.Override @java.lang.SuppressWarnings("all") public boolean equals(final java.lang.Object o) { if (o == this) return true; if (!(o instanceof BuilderWithRecursiveGenerics.Test)) return false; final BuilderWithRecursiveGenerics.Test<?, ?, ?> other = (BuilderWithRecursiveGenerics.Test<?, ?, ?>) o; final java.lang.Object this$foo = this.getFoo(); final java.lang.Object other$foo = other.getFoo(); if (this$foo == null ? other$foo != null : !this$foo.equals(other$foo)) return false; final java.lang.Object this$bar = this.getBar(); final java.lang.Object other$bar = other.getBar(); if (this$bar == null ? other$bar != null : !this$bar.equals(other$bar)) return false; return true; } @java.lang.Override @java.lang.SuppressWarnings("all") public int hashCode() { final int PRIME = 59; int result = 1; final java.lang.Object $foo = this.getFoo(); result = result * PRIME + ($foo == null ? 43 : $foo.hashCode()); final java.lang.Object $bar = this.getBar(); result = result * PRIME + ($bar == null ? 43 : $bar.hashCode()); return result; } @java.lang.Override @java.lang.SuppressWarnings("all") public java.lang.String toString() { return "BuilderWithRecursiveGenerics.Test(foo=" + this.getFoo() + ", bar=" + this.getBar() + ")"; } } }