| 

.NET C# Java Javascript Exception

1
Hallo

Mit dem generischen Zeugs unter Jave habe ich noch zu kämpfen. Ich möchte folgende Methode generisch machen. Das Object "Client" soll nicht mehr in der Methode vorkommen.

public List<StammdatenUpdate<Client>> getUpdates(int type, List<T> objectCollection)
{
Hash[] hases = getHashes(objectCollection);

Gson gson = new GsonBuilder().create();

String json = getJson(new String[] { "type", "listWithHashes" },
new String[] { gson.toJson(type), gson.toJson(hases) });

List<StammdatenUpdate<Client>> retValue = new ArrayList<StammdatenUpdate<Client>>();

if(Tools.isNullOrEmpty(json) == false)
{
Type listType = new TypeToken<ArrayList<StammdatenUpdate<Client>>>()
{}.getType();
retValue = gson.fromJson(json, listType);
}

return retValue;
}


Was muss ich machen damit ich z.B. List<StammdatenUpdate<Client>> retValue = new ArrayList<StammdatenUpdate<Client>>(); generisch hinbekomme?
05.10.2012
GENiALi 2,5k 1 2 8
1 Antwort
1
Also, ich bin zwar nicht auf dem Laufenden, ob es in Android irgendwelche Besonderheiten hinsichtlich Generics gibt - aber in Standard-Java müßtest Du das so machen:

public <TOut> List<TOut> getUpdates(int type, List<T> objectCollection)
{
//...
List<TOut> retValue = new ArrayList<TOut>();
//...
return retValue;
}

oder auch (wenn Dir StammdatenUpdate aus irgendwelchen Gründen wichtig ist):

public <TOut> List<StammdatenUpdate<TOut>> getUpdates(int type, List<T> objectCollection)
{
//...
List<StammdatenUpdate<TOut> retValue = new ArrayList<StammdatenUpdate<TOut>>();
//...
return retValue;
}

Genau wie der Code in Deiner Frage kompilieren beide Beispiele nur, wenn die Klasse, in der die Methode definiert ist, selbst generisch ist mit dem Typparameter T (das geht aus Deiner Frage nicht konkret hervor). Sonst den zweiten Typparameter noch ergänzen:

public <T, TOut> List<StammdatenUpdate<TOut>> getUpdates(int type, List<T> objectCollection)

oder ganz weglassen (für Die Methode selbst scheinst Du ihn ja nicht zu brauchen).

Verwendung in allen Fällen so:

List<StammdatenUpdate<Client>> result = getUpdates(someType, someObjectCollection);
09.10.2012
Matthias Hlawatsch 13,2k 4 9
OK. Methode habe ich jetzt komplett generisch. :-) Wie gewünscht. Aber mein Problem ist noch nicht gelöst. Liegt aber nicht an der Methode sondern an gson.
Type listType = new TypeToken<ArrayList<StammdatenUpdate<TOut>>>()
{}.getType();
retValue = gson.fromJson(json, listType);
Im retValue sind dann nicht die gewünschten Objekte sondern Maps. Aber das hat nichts mehr mit deiner Lösung zu tun.
GENiALi 10.10.2012
1
Oh oh - könnte es sein, dass gson da irgendwas mit Reflection macht? Dann schlägt möglicherweise die Type Erasure zu: in Java steht (im Gegensatz zu .NET) der Typparameter zur Laufzeit nicht zur Verfügung. Generics sind dort reiner "compiler sugar", List und List<String> sind zur Laufzeit dasselbe. Dann hilft nur noch, den Typ explizit an die Methode zu übergeben oder auf die generische Variante zu verzichten.
Matthias Hlawatsch 10.10.2012
@Matthias
Genau so mache ich es jetzt.
GENiALi 16.10.2012

Stelle deine Java-Frage jetzt!