Sagen wir, ich habe eine Methode wie folgt aus:Methode Generics Ohne Argumente
static class Example
{
public static <N extends Number> Number getOddBits(N type)
{
if (type instanceof Byte) return (byte)0xAA;
else if (type instanceof Short) return (short)0xAAAA;
else if (type instanceof Integer) return 0xAAAAAAAA;
else if (type instanceof Float) return Float.intBitsToFloat(0xAAAAAAAA);
else if (type instanceof Long) return 0xAAAAAAAAAAAAAAAAL;
else if (type instanceof Double) return Double.longBitsToDouble(0xAAAAAAAAAAAAAAAAL);
throw new IllegalArgumentException();
}
}
Die tatsächlichen Besonderheiten des Verfahrens ist nicht wirklich wichtig. Um jedoch diese Methode aufrufen, die wir verwenden:
Example.<Float>getOddBits(0f);
Meine Frage ist, ist es möglich, ein solches Verfahren ohne herkömmlichen Parameter zu schreiben. Ohne zu überladen und letztendlich ohne Boxen.
Ideal von aufgerufen:
Example.<Byte>getOddBits();
Ich nehme nicht wegen Löschung, aber man könnte die Beseitigung der superflous Instanz Parameter erhalten und ein Class-Objekt als Parameter verwenden: 'getOddBits (Klasse clazz)'. Ich glaube nicht, dass man Boxen umgehen kann, da der Rückgabetyp nicht ausreicht, um unterschiedliche Signaturen zu erzeugen, d.h. "byte getOddBits()" und "int getOddBits()" können ambivalent sein. –
Pyranja
Es könnte auch andere Optionen geben. Warum musst du das tun? für Ihr Beispiel, mit im Grunde statischen Werten zurückgegeben werden, könnten Sie einfach eine Aufzählung verwenden. Wenn es etwas spezifischeres gibt, könnte es auch andere Optionen geben. Wenn Sie beispielsweise eine Zahl in ein anderes Formular konvertieren, können Sie eine Konvertierungsschnittstelle wie mit einer toBytes- und fromBytes-Methode erstellen. dann musst du die Klassen, die du brauchst, implementieren. Ich bin mir nicht sicher, ob das hilft, wenn nicht, könntest du ein konkreteres Beispiel näher an das Thema legen, wofür du es brauchst? –
@ JohnKane Das Beispiel war willkürlich, nur um die Verwendung eines Unterklassen-Rückgabetyps zu demonstrieren, der über ein Argument auf die sauberste Weise angegeben wurde. Ich hätte wahrscheinlich mit dem alten 'foo-bar-baz' gehen können, aber ich dachte, dass ein praktisches Beispiel besser geeignet wäre. – azz