Wenn der Rückgabetyp der Typ der Klasse sein muss, die das Interface implementiert, dann handelt es sich um einen sogenannten F-bounded Typ:
public interface A>{ public T b(); }
public class C implements A{
public C b() { ... }
}
public class D implements A{
public D b() { ... }
}
Im Klartext deklariert A
einen Typparameter T
, der den Wert jedes konkreten Typs annimmt, der A
implementiert. Dies wird in der Regel verwendet, um Dinge wie clone()
oder copy()
-Methoden mit starken Typen zu deklarieren. Als weiteres Beispiel wird dies von java.lang.Enum
verwendet, um zu deklarieren, dass die geerbte compareTo(E)
-Methode jedes Enums nur auf andere Enums dieses speziellen Typs anwendbar ist.
Wenn Sie dieses Muster oft genug verwenden, werden Sie auf Szenarien stoßen, in denen this
vom Typ T
sein muss. Auf den ersten Blick mag es offensichtlich erscheinen, dass es das ist1, aber Sie müssen tatsächlich eine abstract T getThis()
-Methode deklarieren, die Implementierer trivial als return this
implementieren müssen.
[1] Wie Kommentatoren angemerkt haben, ist es möglich, etwas Listiges wie X implements A
zu tun, wenn X
und Y
ordnungsgemäß kooperieren. Das Vorhandensein einer T getThis()
-Methode zeigt noch deutlicher, dass X
die Absichten des Autors des A
-Interfaces umgeht.