# Generische Methoden mit Java und globale Variablen



## MALPI (3. Mai 2011)

Hallo alle zusammen,

ich stehe gerade vor einem kleinem Problem. Wahrscheinlich ist die Lösung ziemlich simpel. Aber so recht komme ich gerade nicht drauf.

Ich habe eine Klasse die mehrere statische Methoden enthält. Diese Methoden greifen wiederrum auf mehrere statische Variablen zu, die global bekannt sein müssen. 

Soweit so gut.

Die Methoden enthalten allerdings generische Argumente die nun wiederrum für die statischen Variablen benötigt werden.

Dies sieht in etwa so aus.


```
public class MyClass{
private static VarOne<gen1> var1;
private static VarTwo<gen2> var2;

public static <gen1,gen2>void  foo();
public static <gen1,gen2>void  bar();
}
```

Wie kann ich nun die generischen Argumente die erst über die statischen Methoden bekannt werden, an die Variablen weiterreichen?

Grüße,

MALPI


----------



## SlaterB (3. Mai 2011)

geht gar nicht,
was hast du denn da vor?


----------



## MALPI (3. Mai 2011)

Im endeffekt geht es darum, das ich mit Hilfe der Methode 
	
	
	
	





```
foo()
```
 die globalen Variablen initialisiere, diese wird innerhalb von 
	
	
	
	





```
bar()
```
 aufgerufen. Eigentlich tut sie nichts anderes als ein Konstruktor.


----------



## SlaterB (3. Mai 2011)

soweit klar, aber angenommen es ginge, was würde dir das bringen,
wo verwendest du die Variablen, was stellst du dort damit an so dass der Typ wichtig ist, 
wie willst du bei einer statischen Variablen den Typ unterscheiden?

das gibt es einfach komplett nicht, eine statische Variable kann nur String, Auto oder meinetwegen List<Integer> sein, aber nichts variables


----------



## Andi_CH (4. Mai 2011)

Das ist C-Niveau oder gar Assembler ;-)
Wenn du das unbedingt willst deklariere deine Variablen als Object

Ich meine zu wissen, dass sich static und generisch ausschliessen oder irre ich mich? Ich lasse mich gerne aufklären.


----------



## MALPI (4. Mai 2011)

Andi_CH hat gesagt.:


> Das ist C-Niveau oder gar Assembler ;-)
> Wenn du das unbedingt willst deklariere deine Variablen als Object
> 
> Ich meine zu wissen, dass sich static und generisch ausschliessen oder irre ich mich? Ich lasse mich gerne aufklären.



Ich lasse mich ebenfalls gerne aufklären .

Das Problem ist halt das die Variablen auch generische Parameter erwarten. Im Endeffekt stellt es kein Problem dar, da kompilier und ausführbar. Aber ich fänds halt "schöner" wenns dafür ne Lösung gäbe.

Grüße,

MALPI


----------



## Andi_CH (4. Mai 2011)

Meine Frage war eigentlich an die gerichtet die es wissen müssten.

Wa du vorhast ist alles andere als schön um nicht zu sagen potthässlich.

So geht es und so ist es ursprünglich auch gedacht. So nebenbei -  Variablennamen bitte mit Kleinbuchstaben beginnen.


```
public class Test<gen1, gen2> {

	private gen1 varOne;
	private gen2 varTwo;
	
	public void setOne(gen1 par) {
		varOne = par;
	}
	public void setTwo(gen2 par) {
		varTwo = par;
	}
	public gen1 getOne() {
		return varOne;
	}
	public gen2 getTwo() {
		return varTwo;
	}

	public static void main(String[] args) {
		Test<String, Integer> t1 = new Test<String, Integer>();
		t1.setOne("Hello World");
		t1.setTwo(1);
		System.out.println(t1.getOne());
		System.out.println(t1.getTwo());
	}
}
```


----------



## MALPI (4. Mai 2011)

Das, dass Ganze so funktioniert ist mir klar.

Vielleicht habe ich mich nicht konkret genug ausgedrückt, aber [c]VarOne, VarTwo[/code] sind keine Variablen sondern Typen.

Ich arbeite in dem Projekt mit mehreren typen von Knoten und Kanten. Diese spezifiziere ich über die generischen Parameter.

Diese müsste ich dann halt eben auch in den instantiierten Variablen der Klasse angeben.

In meinem ersten Post habe ich bei den Methoden leider einen Fehler gemacht. Die Methoden sollen natürlich ein Objekt zurückgeben.


```
public class MyClass{
private static VarOne<Gen1> var1;
private static VarTwo<Gen2> var2;
 
public static <Gen1,Gen2> Map<Gen1,Gen2> foo(Map<Gen1,Gen2> param);
public static <Gen1,Gen2> Map<Gen1,Gen2> bar(Map<Gen1,Gen2> param);
}
```

Momentan sieht es allerdings so aus:


```
public class MyClass{
private static VarOne var1;
private static VarTwo var2;
 
public static <Gen1,Gen2> Map<Gen1,Gen2> foo(Map<Gen1,Gen2> param);
public static <Gen1,Gen2> Map<Gen1,Gen2> bar(Map<Gen1,Gen2> param);
}
```

Dementsprechend bekomme ich für 
	
	
	
	





```
var1, var2
```
 Warnings. Was an sich nicht schlimm ist, aber unschön.

Grüße,

MALPI


----------



## SlaterB (4. Mai 2011)

man kann eine statische Variable List<String> anlegen, insofern schließen sich static und generisch streng genommen nicht gegenseitig aus  ,
dass man keine 'type variable' verwenden kann, ergibt sich ja mehr oder weniger schon durch Ausprobieren


> A type variable is an unqualified identifier. Type variables are introduced by generic class declarations, generic interface declarations, generic method declarations, and by generic constructor declarations.


Generics in Java - Wikipedia, the free encyclopedia

----
edit: Posting von 9.49 noch nicht gesehen, das klärt das vielleicht schon

> Aber ich fänds halt "schöner" wenns dafür ne Lösung gäbe.

ohne nerven zu wollen: solange kein Problem erkennbar ist, ist besonders schwierig über eine Lösung nachzudenken,
dass es in Java nicht geht ist ein Punkt, ein anderer ist nach wie vor, dass es selbst theoretisch keinen Sinn ergibt,
genauso wie über den Benzinverbrauch eines Schreibtischs nachzudenken

edit: zum Posting von 9.49:
jetzt ist es bisschen verständlicher, wenn auch nicht ganz klar ist, inwiefern diese Variablen für die statischen Methoden benötigt werden,
da aber die Methoden offensichtlich mit wechselnden generischen Parametern aufgerufen werden,
hätte es auch in diesem Fall keinen Sinn, den Variablen einen bestimmten Typ zuzuordnen, auch keinen 'genauso wechselnden' oder was auch immer,

nur um die Warning wegzubekommen solltext du keine wirre sinnlose Syntax bemühen,
wenn die statischen Variablen in den statischen Methoden auf suspekte Weise mit wechselnden Typen verwendet werden, hättest du eher noch mehr Warnungen verdient 
gehen nicht lokale Variablen?


----------



## MALPI (4. Mai 2011)

SlaterB hat gesagt.:


> > Aber ich fänds halt "schöner" wenns dafür ne Lösung gäbe.
> 
> ohne nerven zu wollen: solange kein Problem erkennbar ist, ist besonders schwierig über eine Lösung nachzudenken,
> dass es in Java nicht geht ist ein Punkt, ein anderer ist nach wie vor, dass es selbst theoretisch keinen Sinn ergibt,
> genauso wie über den Benzinverbrauch eines Schreibtischs nachzudenken


Danke für den Lacher! 



SlaterB hat gesagt.:


> edit: zum Posting von 9.49:
> jetzt ist es bisschen verständlicher, wenn auch nicht ganz klar ist, inwiefern diese Variablen für die statischen Methoden benötigt werden,
> da aber die Methoden offensichtlich mit wechselnden generischen Parametern aufgerufen werden,
> hätte es auch in diesem Fall keinen Sinn, den Variablen einen bestimmten Typ zuzuordnen, auch keinen 'genauso wechselnden' oder was auch immer,
> ...



Die generischen Variablen haben sozusagen alle einen Basistyp(Knoten und Kanten). Diese werden halt mit den erbenden Typen um bestimmte Eigenschaften und Methoden erweitert. Also an sich, ist der Typ nicht "wechselnd". Er wird nur erweitert.

Lokale Variablen würden gehen, wenn ich die Hilfsfunktionen alle in die "eigentliche statische" Methode verpacke. Dann wird der Code allerdings ziemlich unübersichtlich. 

Ich denke ich werds einfach bei den Warnings belassen. Ich hatte halt gehofft, das es eine Syntaktische oder "Designtechnische" Lösung gibt.

Danke für die Antworten.

Grüße,

MALPI


----------

