Antwort auf: Wieso kompiliert dieser Code nicht?

EIDI-Crashkurs 2020 Wieso kompiliert dieser Code nicht? Antwort auf: Wieso kompiliert dieser Code nicht?

#3371

Das liegt daran, dass generische Typen nur in einem objektorientierten Kontext benutzt werden können. Erzeugt man beispielsweise ein Foo<String> Objekt, so wäre klar, dass die Methode m einen String erwartet und auch einen String zurückgibt. Das wäre richtig, wenn die Methode nicht static wäre. Statische Methoden müssen aber nicht auf einem Objekt aufgerufen werden. Man ruft sie i. d. R. über den Klassennamen auf, also hier mittels Foo.m(...). Nun fehlt der Typparameter. Man könnte argumentieren, dass man den Typparameter ja angeben könnte, beispielsweise mittels Foo<String>.m(...). Das ist richtig, trotzdem funktioniert es bei statischen Methoden nicht. Warum genau das nicht funktioniert kann ich dir nicht sagen – eventuell hat man sich einfach dafür entschieden (weil meiner Meinung nach könnte es theoretisch auch möglich sein).

Für dich heißt das, dass du dir einfach merkst, dass man generische Typen nicht in einem statischen Kontext benutzen kann. Möchte man das, so benötigt man eine generische Methode. Man müsste hier also public static <R> R m(R r) schreiben. Das <R> führt den neuen Typparameter R ein (könnte auch anders heißen, hat nichts mit dem R aus Foo<R> zu tun, dieses R wäre dann überflüssig).