A common pattern for abstract Builders is to declare an instance method named
self(), which subtypes override and implement as return this (see Effective
Java 3rd Edition, Item 2).
Returning anything other than this from an instance method named self() with
a return type that matches the enclosing class will be confusing for readers and
callers.
If an unchecked cast is required, prefer a single-statement cast, with the suppression on the method (rather than the statement). For example:
@SuppressWarnings("unchecked")
default U self() {
return (U) this;
}
Instead of:
default U self() {
@SuppressWarnings("unchecked")
U self = (U) this;
return self;
}
Suppress false positives by adding the suppression annotation @SuppressWarnings("SelfAlwaysReturnsThis") to the enclosing element.