Generisch mit Variabler Argumente
Ich will etwas tun, wie
public interface Foo<R, P...> {
public R bar(P...) {/*misc*/}
}
erhalten Sie ein array von Typen verwenden, die in meine gefesselten Umsetzung. Ist das möglich in java?
Varargs ausgelegt ist, lassen Sie mich noch eine beliebige Anzahl von Argumenten einer bestimmten Klasse.
Ich will, es zu benutzen (oder etwas ähnliches) zu haben, meine Methode akzeptieren mehrere Argumente, von denen jedes ein Mitglied einer bestimmten anderen Klasse. Diese Klassen sind definiert, wenn die generische gebunden ist.
Ich wissen, gibt es Arbeit, Tips und Tricks, aber es ist eine Typ-sichere Weg, dies zu tun?
- Was ist falsch mit dem, was Sie haben so weit gekommen? Das einzige Problem ist, dass varags spielt nicht furchtbar schön mit Generika.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie anscheinend wollen, um in der Lage zu machen
bar
mehrere Parameter verschiedene Arten (etwas varargs nicht verwendet für), würde ich vorschlagen, so dass es statt einen einzigen parameter. Sie können dann machen Sie, dass einzelne parameter einen container, die einzelnen "Parameter", die Sie verwenden möchten.Im Allgemeinen wäre es am besten, um eine Klasse für jeden Satz von Parametern, die Sie verwenden möchten, mit dieser Methode, so dass Sie gute Namen für die einzelnen Objekte, die es enthält. Sie könnten jedoch auch etwas tun, wie das erstellen einer Reihe von Tupel-Typen (wie
Pair
) als Inhaber.Hier ein Beispiel:
refactor > introduce parameter object
Sie schrieb:
Ich glaube nicht, dass es möglich ist, dies zu tun in einer typsicheren Art und Weise ohne einige hässliche hacks, mag auch eine Instanz der Klasse zusammen mit dem Objekt.
Das problem ist, dass man mit VarArgs Sie tatsächlich übergeben wird ein Array. Sie können aber nicht ein array mit verschiedenen Arten von Gegenständen, die Sie alle haben das gleiche zu sein (oder Unterklassen, so dass, wenn Sie haben X[] y, dann ist jedes element muss eine Unterklasse von X)
Wenn Ihre Funktion können wirklich befassen sich mit mehrere Typen, die Sie erstellen könnte so etwas wie eine Klasse, die speichert eine Instanz der Klasse zusammen mit einer Instanz von T und den pass in eine var-args-Liste dieses Containers.
So zum Beispiel könnten Sie haben
haben und dann eine Funktion, die so ähnlich aussieht, wie
Diese Art von hacks sind notwendig, weil Java type erasure. Der generische parameter wird entfernt, zur Laufzeit, also, wenn Sie wollen, es zu benutzen, setzen Sie es zurück.