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?
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
(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.
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.
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.