Generische Java-Funktion: Rückgabe des generischen Typs
Hier ist ein generisches Java-Muster:
public <T> T getResultData(Class<T> resultClass, other_args) {
...
return resultClass.cast(T-thing);
}
Ein typischer Anruf sieht folgendermaßen aus:
DoubleBuffer buffer;
buffer = thing.getResultData(DoubleBuffer.class, args);
Ich habe nie herausgefunden, wie dieses Muster sauber verwendet werden kann, wenn der gewünschte Rückgabetyp selbst generisch ist. Konkret gesagt, was ist, wenn eine Funktion wie diese zurückkehren möchte?Map<String,String>
? Da Sie für ein generisches Objekt natürlich kein Klassenobjekt erhalten können, wäre die einzige Option, zu übergebenMap.class
und dann brauchst du eine Besetzung und eine@SuppressWarning
Letztendlich.
Man endet mit einem Anruf wie:
Map<String, String> returnedMap;
returnedMap = thing.getResultData(Map.class, some_other_args);
Jetzt braucht man wieder Würfe und unterdrückt eine Warnung.
Ich nehme an, man könnte dem etwas abnehmenjava.lang.reflect.Type
Familie statt derClass
, aber diese sind nicht besonders einfach zu konstruieren. Das sieht aus wie:
class Dummy {
Map<String, String> field;
}
...
Type typeObject = Dummy.class.getField("field").getGenericType();
In Anbetracht dessen könnte die aufgerufene Funktion den Basistyp extrahieren und diesen zum Casting oder NewInstance-ing verwenden, aber das Dummy-Feldgeschäft sieht sicher hässlich aus.
Beachten Sie, dass Funktionen wie diese nicht immer aufgerufen werdennewInstance
. Wenn doch, müssen sie natürlich nicht anrufenresultClass.cast
.