Ich habe eine ziemlich komplizierte Reihe von generischen Klassen in Java. Zum Beispiel habe ich eine SchnittstelleTyp-Aliase für Java-Generics
interface Doable<X,Y> {
X doIt(Y y);
}
und die Umsetzung
class DoableImpl implements Doable<Foo<Bar<Baz,Qux>>,Foo<Bar<Zot,Qux>>> {
Foo<Bar<Baz,Qux>> doIt(Foo<Bar<Zot,Qux>> fooBZQ) { ... }
}
In der realen Implementierung Doable
ziemlich viele Methoden hat und so Foo<Bar<Baz,Qux>>
usw., erscheinen immer und immer wieder. (Glauben Sie es oder nicht, die generischen Typen sind ein bisschen schmerzhafter als das. Ich habe sie für das Beispiel vereinfacht.)
Ich möchte diese vereinfachen, um mich selbst zu tippen und die Belastung zu erleichtern in meinen Augen. Was ich möchte, ist eine einfache "Typ Alias" für Foo<Bar<Baz,Qux>>
, etc., sagen FooBBQ
und FooBZQ
.
Meine aktuelle Idee ist Wrapper-Klassen zu definieren:
class FooBBQ {
public static FooBBQ valueOf(Foo<Bar<Baz,Qux>> fooBBQ) {
return new FooBBQ(fooBBQ);
}
private Foo<Bar<Baz,Qux>> fooBBQ;
private FooBBQ(Foo<Bar<Baz,Qux>> fooBBQ) {
this.fooBBQ = fooBBQ;
}
public Foo<Bar<Baz,Qux>> toGeneric() {
return fooBBQ;
}
}
class FooBZQ { /* pretty much the same... */ }
class DoableImpl implements Doable<FooBBQ,FooBZQ> {
FooBBQ doIt(FooBZQ fooBZQ) { ... }
}
Das funktioniert gut, aber es hat einige Nachteile:
- Wir müssen für jede generische Instanz separate Wrapper definieren. Die Wrapper-Klassen sind kurz und stilisiert, aber ich kann keinen Weg finden, sie zu macroisieren.
Wir haben die Übersetzung Overhead (konzeptionell, wenn nicht operativ) von
valueOf
undtoGeneric
Aufruf zwischenFooBBQ
undFoo<Bar<Baz,Qux>>
zu konvertieren. wenndoIt
Anrufe in eine Bibliotheksroutine zum Beispiel, die eineFoo<Bar<Zot,Qux>>
erwartet (was die reale Umsetzung der Fall ist), haben wir am Ende mit etwas wiereturn FooBBQ.valueOf(libraryCall(fooBZQ.toGeneric()))
, wo würden wir ursprünglich hatten
return libraryCall(fooBZQ);
Gibt es eine andere Möglichkeit, das Verhalten "Typ-Alias" zu erhalten, das ich hier haben möchte? Vielleicht mit einem Makro-Toolset von Drittanbietern? Oder muss ich akzeptieren, dass ich viel tippen muss, in einer Richtung (mit den generischen Typen in der Implementierung) oder in der anderen (Wrapper für sie schreiben)? Vielleicht ist es eine schlechte Idee, so viele generische Parameter herumfliegen zu lassen, und ich muss das Problem überdenken.
[UPDATE] OK, ich verbiete weitere "Do not do that" Antworten. Nimm es als gegeben, dass Foo<Bar<Baz,Qux>>
echten Wert in meiner Problemdomäne hat (Pete Kirkham kann Recht haben, dass es genug Wert hat, um eine richtige Wrapper-Klasse mit einem beschreibenden Namen zu erhalten). Aber das ist ein Programmierproblem; Versuchen Sie nicht, das Problem zu definieren.
Ich werde 'wahrscheinlich ja' zum letzten sagen, habe aber kein konstruktives Feedback: P Es sieht aus wie ein Durcheinander! Viel Glück! –
Ich denke, diese Frage wäre ein guter Vorschlag für Java. Wenn Sie Oracle eine Type Aliasing-Funktion vorschlagen könnten, wäre es meiner Meinung nach eine großartige Sprachfunktion, die die Sprache vereinfacht und den Quellcode lesbarer macht. –
Knee tief in Java heute und wollte etwas verbose Code bereinigen ... nicht nur bekomme ich keine Typ-Inferenz, aber auch keinen Typ-Aliasing. * schluchz * –