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



## DarthShader (6. Juli 2008)

Hallo zusammen,

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


```
public < T > List< T > getRegex( String pathRegex )
```

Nun kann ich folgendes machen:


```
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


```
public ButtonGroup( List< JButton > buttons )
```


Was jetzt aber nicht funktioniert, ist folgendes:


```
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!


----------



## Orbit (6. Juli 2008)

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


----------



## Thomas Darimont (6. Juli 2008)

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.

```
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:

```
System.out.println(foo(bar()));
```


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

Gruß Tom


----------



## DarthShader (6. Juli 2008)

Hallo,



Orbit hat gesagt.:


> 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 




Thomas Darimont hat gesagt.:


> 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).



Thomas Darimont hat gesagt.:


> wenn du nun
> anstatt:
> 
> ```
> ...



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


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

aber so funktioniert es natürlich nicht.


----------

