Kann ich in Java eine beliebige Anzahl generischer Typparameter angeben?

8

Ich suche nach einer bestimmten Art von Schnittstelle in Java (obwohl dies genauso für reguläre Klassen gilt) . Diese Schnittstelle müsste eine Methode enthalten, zB invoke ; es würde mit einer variierenden Anzahl von Parametern aufgerufen werden, abhängig von den generischen Typargumenten, die geliefert werden.

Als ein Beispiel:

%Vor%

Um kurz zu erklären, wie dies verwendet werden könnte (und einen Kontext bereitstellen) , betrachten Sie eine Klasse Delegator : Die Klasse nimmt eine variierende Anzahl von generischen Typen an und hat eine einzige Methode - invoke , mit diesen Parametertypen. Die Methode gibt ihre Parameter an ein Objekt in einer Liste weiter: eine Instanz von IDelegate , die dieselben generischen Typen verwendet. Dies ermöglicht Delegator , zwischen mehreren Delegate-Methoden zu wählen (definiert in IDelegate ), ohne dass für jede spezifische Liste von Parametertypen eine neue Klasse erstellt werden muss.

Ist so etwas verfügbar? Ich habe in C ++ über variadische Vorlagen gelesen, kann aber in Java nichts Ähnliches finden. Gibt es so etwas? Wenn nicht, was wäre der sauberste Weg, das gleiche Datenmodell zu emulieren?

    
Sam McCreery 06.11.2015, 14:31
quelle

3 Antworten

4
  

Ist so etwas verfügbar? Ich habe über variadische Vorlagen gelesen   in C ++, kann aber in Java nichts Ähnliches finden. Ist so etwas   verfügbar?

Nein, diese Funktion ist in Java nicht verfügbar.

    
Puce 06.11.2015, 14:33
quelle
2

Nein, so etwas gibt es nicht direkt. Wenn Sie jedoch eine Bibliothek mit Tuple -Klassen verwenden, können Sie sie simulieren, indem Sie einfach die Schnittstelle

erstellen %Vor%

(Diese Schnittstelle ist im Wesentlichen identisch mit Consumer<T> .)

Dann könntest du zum Beispiel

machen %Vor%

Sie würden für jede Anzahl von Parametern einen separaten Tuple -Typ benötigen. Wenn Sie eine Tuple -Klasse für 4 Parameter haben, aber nicht eine für 5, können Sie einen zusätzlichen Parameter mit einer Pair -Klasse komprimieren.

%Vor%

Indem Sie Tupeltypen auf diese Weise verschachteln, erhalten Sie eine unbegrenzte Anzahl von Parametern. Diese Problemumgehungen sind jedoch wirklich hässlich, und ich würde sie nicht verwenden.

    
Paul Boddington 06.11.2015 14:48
quelle
2

Angesichts des von Ihnen angegebenen Kontextes würde ich empfehlen, ein List als Parameter zu verwenden. Wenn diese Parameter etwas gemeinsam haben, können Sie Ihre Liste auf <T extends CommonParrent> beschränken, anstatt List<Object> zu verwenden. Wenn dies nicht der Fall ist, möchten Sie möglicherweise die Markierungsschnittstelle verwenden.

Hier ist ein Beispiel.

%Vor%

Der größte Fehler dieser Lösung besteht darin, dass Kinder ihren Typ über enum angeben müssen, das den Umwandlungen in der switch-Anweisung entsprechen sollte. Wenn Sie also einen dieser beiden Orte ändern, müssen Sie daran denken, den anderen zu ändern. weil der Compiler das nicht sagen wird. Sie werden nur einen solchen Fehler finden, indem Sie den Code ausführen und eine bestimmte Verzweigung ausführen, so dass eine testgesteuerte Entwicklung empfohlen wird.

    
Jaroslaw Pawlak 06.11.2015 15:15
quelle

Tags und Links