Generics - Rückgabewert einer generischen Methode als Parameter einer Zweiten

DarthShader

Erfahrenes Mitglied
Hallo zusammen,

ich bin gerade etwas verwirrt in Bezug auf Java Generics. Ich habe hier eine Klasse mit der Methodensignatur

Java:
public < T > List< T > getRegex( String pathRegex )

Nun kann ich folgendes machen:

Java:
List< JButton > buttonList = getRegex( "button.+" );

Durch den generischen Parameter wird der Rückgabetyp von "getRegex" zu "List< JButton >", das klappt wunderbar.

Nun das Problem: Ich habe eine Klasse "ButtonGroup" mit dem Konstruktor

Java:
public ButtonGroup( List< JButton > buttons )


Was jetzt aber nicht funktioniert, ist folgendes:

Java:
ButtonGroup group = new ButtonGroup( getRegex( "button.+" ) );

Der Fehler lautet: "The constructor ButtonGroup(List<Object>) is undefined".

Im Prinzip verstehe ich den Fehler ja, denn der Rückgabetyp stimmt mit dem erwarteten Konstruktor-Parameter-Typ nicht überein. Aber im ersten Beispiel oben kann Java den Rückgabetyp ja auch dynamisch anpassen, wieso klappt das nun bei dem Konstruktor-Paramter nicht?

Gibt es eine Möglichkeit, in dem letzten Code-Beispiel einen Cast oder Ähnliches vorzunehmen, damit das der Konstruktor so akzeptiert? Oder muss ich wirklich die Methodensignaturen ändern?


Vielen Dank für Eure Hilfe!
 
Du kannst doch ButtonGroup gar keine Parameter übergeben ... (steht zumindest hier).

oder irre ich mich und du hast ne erweiterte Klasse ButtonGroup?
Nach dieser refernez müsstest du jeden Button einzeln per add hinzufügen...
Grüße,
Orbit
 
Hallo,

der java Compiler den du verwendest kann den Typ eines Parameters nicht für die Bestimmung eines impliziten generischen Rückgabetyps verwenden. Der Compiler sieht hier nur den Raw-type -> objekt, List<Object> ... etc.
Java:
package de.tutorials;

import java.util.ArrayList;
import java.util.List;

public class GenericsExample {
    public static void main(String[] args) {
        System.out.println(foo(bar())); // --> Compilefehler -> hier "sieht" der Compiler List<Object> 
    }

    private static String foo(List<String> bar) {
        return null;
    }

    private static <TTarget> List<TTarget> bar() {
        return new ArrayList<TTarget>();
    }
}

wenn du nun
anstatt:
Java:
        System.out.println(foo(bar()));

Java:
        List<String> s = bar();
        System.out.println(foo(s));
schreibst, kann der normale Java Compiler den generischen Rückgabetyp korrekt bestimmen.

Gruß Tom
 
Hallo,

Du kannst doch ButtonGroup gar keine Parameter übergeben ... (steht zumindest hier).

oder irre ich mich und du hast ne erweiterte Klasse ButtonGroup?

es war nur irgendein konstruiertes Beispiel, um den Sachverhalt darzulegen, und meine Klasse hat nichts mit "javax.swing.ButtonGroup" zu tun. Ich habe den Namen wohl etwas unglücklich gewählt. Du könntest den Namen "ButtonGroup" auch einfach durch etwas beliebiges Austauschen, an meinen Code-Beispielen würde sich dabei nichts ändern :)


Hallo,

der java Compiler den du verwendest kann den Typ eines Parameters nicht für die Bestimmung eines impliziten generischen Rückgabetyps verwenden. Der Compiler sieht hier nur den Raw-type -> objekt, List<Object> ... etc.

Und das wundert mich eben so, da er es ja in dem ersten Fall kann (siehe meinen 2. Quellcode im 1. Beitrag).

wenn du nun
anstatt:
Java:
        System.out.println(foo(bar()));

Java:
        List<String> s = bar();
        System.out.println(foo(s));
schreibst, kann der normale Java Compiler den generischen Rückgabetyp korrekt bestimmen.

Nagut, aber genau das habe ich oben in meinen Beispielen ja schon selbst geschrieben :) Ich hätte mir nur gewünscht, dass es doch eine Lösung geben könnte, eben z.B. mit einem Cast, nach dem Motto

Java:
System.out.println(foo( (List<String>)bar() ) );

aber so funktioniert es natürlich nicht.
 
Zurück