Generics machen mich verrückt

Hag2bard

Bekanntes Mitglied
Hallo,

ich verstehe den merkwürdigen Aufbau von Generics nicht. Umso mehr ich google umso schlimmer und unverständlicher wird es.
Ich habe folgendes Szenario:

Java:
private static String getResponse(final String decision)
{
    switch(decision)
    {
            case "1" ->
            {
                return new String("string");
            }
            case "2" ->
            {
                return new String("3");
            }
    }
}

Ich möchte nun aber, dass statt Strings verschiedene Klassen zurück gegeben werden.
Mein IntelliJ meckert aber nun bei den returns rum, da er das ganze zu T casten möchte.

Mein Code sieht so aus:
Java:
private static <T> T getResponse(final String decision)
{
    return new String("test");
}

Die Meldung die IntelliJ bringt ist folgende:

1692970726610.png
1692970748429.png

Was ist da los?
 

KonradN

Super-Moderator
Mitarbeiter
Das ist doch verständlich. Du schreibst eine Methode getResponse, die ein T zurück geben soll. T kann kann ja alles sein. Also z.B. kann ich die generische Methode ja nutzen, um ein Integer zurück zu bekommen. Oder einen Kunden. Oder was auch immer.

Aber die Implementierung mit return new String("test") gibt immer ein String zurück.

Was T sein soll, wird ja später erst festgelegt an der Stelle, an der deine Generische Klasse / Methode genutzt wird.
 

White_Fox

Top Contributor
Du kannst in einem Generic nur eine Klasse deklarieren.

Was dank Vererbung aber geht: Wenn du verschiedene abgeleitete Klassen hast kannst du die Superklasse deklarieren und alle abgeleiteten Klassen gehen da rein.

Du kannst z.B. eine Liste für die Klasse 'Tier' deklarieren und darin 'Hund-', 'Katze-', und 'Ente'-Objekte, die alle von 'Tier' erben, reinwerfen. Ein Hund ist ein Tier, also geht das.

Und absolut alles in Jave erbt von 'Objekt', aber wenn du Generics von Object deklarieren willst, wird wahrscheinlich mit deinem Design so einiges nicht hinhauen.
 

KonradN

Super-Moderator
Mitarbeiter
Falls Du eine Methode haben willst, dessen Rückgabe ganz dynamisch ist, dann kannst Du das leider nicht ganz so trivial bauen.

Das Problem ist, dass durch type erasure der konkrete Typ Parameter verschwindet und zur Laufzeit diese Information nicht mehr da ist. Daher muss man den Typ selbst noch irgendwie bekommen und dazu kann man die Klasse von T als Parameter anfordern, also ein Parameter vom Typ Class<T>

Das kann dann z.B. so aussehen (Ich baue einfach einmal ein sinnloses Beispiel für einen universellen Konverter, der dann mit einer Methode aufgerufen werden kann).

Java:
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

public class Converter {

private Map<Class, Function<String, Object>> converter = new HashMap<>();

    public Converter() {
converter.put(Integer.class, (String s) -> Integer.parseInt(s));
    }

public  <T> T getValue(Class<T> resultClass, String value) {
Function<String, Object> converterMethod = converter.get(resultClass);
        if (converterMethod == null) throw new IllegalStateException("No converter available for class " + resultClass.getName());

        return (T) converterMethod.apply(value);
    }
}

Nutzbar wäre es dann z.B. so:
Java:
public class Test {
public static void main(String[] args) {
Converter converter = new Converter();

        Integer i = converter.getValue(Integer.class, "3");
        System.out.println(i);
    }
}

Das Beispiel zeigt, wie etwas aussehen kann, wenn man in einer generischen Klasse weiterhin den genauen Typ Parameter benötigt.
Ich habe nur eine konkrete Methode hinterlegt (String -> Integer), aber das kann natürlich noch beliebig erweitert werden.

Sowas braucht man aber eher selten.

Man kann da z.B. ein Szenario bedenken: ResultSet einer JDBC Query. Da kann man dann ja diverse Felder in diversen Typen aufrufen. Also könnte man da dann je nach Typ die entsprechende Methode des ResulSet aufrufen. Aber was gewinnt man dadurch?

Statt rs.getInt("MyField") hat man dann etwas wie get(Integer.class, "MyField") wobei get dann so eine Wrapper Methode wäre oder so.

Ich bin mir nicht sicher, ob oder wann man da etwas gewinnen würde. Evtl. wenn das, was da passieren soll, dynamisch ist?

Daher: Es geht hier nur um das Thema technische Machbarkeit. Es kann Fälle geben, da man sowas braucht und daher sollte man sowas durchaus kennen.
 

Hag2bard

Bekanntes Mitglied
Ich habe die Methode umgebaut, so dass ich nur einen Rückgabetyp bestimmt habe(DTOs). Das ganze ist übrigens ein Miniserver der get httpRequests in Form von Json im http Body empfängt(z.B. ein Request nach einem Kunden), diese dann zu einem DTO verarbeitet. Eine Schnittstelle zwischen einer Planungssoftware und einer Einzelhandelssoftware die Kunden, Planungen, Kaufverträge usw hin und her schiebt. In dieser stark verkürzten und abgewandelten Methode, von der ich rede baue ich nun DTOs und liefer die zurück. Das sind DTOs wie Kunde, Adresse aber auch einen ErrorReport. Diese DTOs werden dann einfach zu JSON Strings umgewandelt und zurück geschickt.

Ist ein interessantes Projekt, hier habe ich auch viel über ExceptionHandling gelernt.
 

Marinek

Bekanntes Mitglied
Du hast eine Restschnittstelle zwischen zwei Systemen implementiert.

Du kannst gerne deinen Quellcode veröffentlichen, dann können wir es für dich reviewn.
 

KonradN

Super-Moderator
Mitarbeiter
Das, was Du beschreibst, ist natürlich sehr oberflächig. Aber das ist genau das, was die Frameworks so machen. Egal ob Jakarta EE, Spring Boot, Quarkus, .... Du definierst die Schnittstelle mit den DTOs und das Framework kümmert sich dann darum. Die Umwandlung von JSON in ein DTO machst Du also nicht selbst.

Einfach mal schnell ein Beispiel per Google gesucht - ich habe da jetzt mal Spring Boot REST Services ausgesucht:
Getting Started | Building REST services with Spring
Da sieht man dann natürlich erst einiges Spring Boot typische mit der Entity und der Klasse mit der main Methode .... aber der Controller enthält dann einfach nur etwas wie:

Java:
  @PostMapping("/employees")
  Employee newEmployee(@RequestBody Employee newEmployee) {
    return repository.save(newEmployee);
  }

Sprich: Im Request wird dann ein Employee Entity erwartet. Das kann dann als JSON oder XML übergeben werden (Kann man natürlich konfigurieren wenn man möchte). Und die Entity, die zurück gegeben wird, wird auch automatisch serialisiert. Also je nach Anforderung vom Client kann das JSON oder XML sein (Wenn man alles zu lässt, dann kann der Client das in seinem Request in den Headern bestimmen).

Aber evtl. machst Du da ja auch irgend etwas anderes, wo diese Lösungen so nicht verwendet werden können oder ich habe Dich einfach falsch verstanden.
 

Hag2bard

Bekanntes Mitglied
Genau es geht hier um Spring Boot und über die Lösung die gerade genannt hast, habe ich nun einen Tag mal nachgedacht. Ich nutze die Klasse HttpServer um die Requests zu empfangen. Gibt es da für Spring Boot eine gutes Cheatsheet? Ich möchte dass der Request ein Entity ist.
 

Marinek

Bekanntes Mitglied
Poste mal deine HttpServer klasse.

Das Beispiel von Konrad zeigt ja, wie man entities verwendet.

Spring Boot ist ausgezeichnet dokumentiert. Da liefert Google alles zu.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10
K Aufgabe Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben