generics frage
-
hallo ich möchte eine template funktion zusammenbasteln die nur Zahlen akzeptiert.
diese funktion soll wissen was ihr übergeben wurde und den selben typ zurückliefern, nur dass einige rechenoperationen dazwischen liegen
also dachte ich so etwas in der art
public static <T extends Number> foo(T x)
{
return (T) mach_was_ganz_tolles(x);
}nur leider geht das nicht so,
Number scheint keine einzige Rechenoperation zu kennen...Was soll ich tun um mein ziel so elegant wie möglich zu erreichen?
-
public class Main { /** * @param args */ public static void main(String[] args) { System.out.println(Main.foo(12)); System.out.println(Main.foo(3.5f)); System.out.println(Main.foo(3f).getClass().getName()); } @SuppressWarnings("unchecked") public static <T extends Number> T foo(T x) { if (x instanceof Integer) { int a = x.intValue()+ x.intValue(); return (T) Integer.valueOf(a); } if (x instanceof Float) { float a = x.floatValue()*2; return (T) Float.valueOf(a); } return null; } }
24
7.0
java.lang.Floatsicher nicht die optimale lösung, aber wenn du sowieso nach typ eine spezielle operation haben willst, sonst sehe ich überhaupt keinen grund sich überhaupt etwas derartiges zu überlegen
es gibt nunmal einen guten grund warum number keine operationen kennt
-
wenn du schon dabei bist,
was ist der grund dafür dass Number keine Operationen kennt und warum sind alle Basisklassen immutable?
Das führt immer wieder zu Problemen bei mir dass ich Wrapperklassen drum rum schachteln muss.
-
shisha schrieb:
wenn du schon dabei bist,
was ist der grund dafür dass Number keine Operationen kennt und warum sind alle Basisklassen immutable?
Das führt immer wieder zu Problemen bei mir dass ich Wrapperklassen drum rum schachteln muss.
es gibt eine reihe sehr guter gründe, warum klassen immutable sind
joshua bloch kann es gar nicht oft genug erwähnen, hier sei auch gleich effective java genannt+thread save
+kein copy constructor nötig und auch kein clone
+einfach zu bauen und zu pflegen
+keine zustandsproblemeferner möchte ich nciht zustimmen, dass alle basisklassen immutable sind
wrapperklassen worum schachteln? durch die einführung von autoboxing klappt es doch zwischen primitiven und klasse ohne probleme
und warum sollte number operationen kennen?
wir habne den fall, dass z.B. biginteger add kennt
und integer nicht, dafür können wir auch wieder int benutzen und das wie gesagt, dank autoboxing fast ohne das wir es überhaupt merken
biginteger besitzt natürlich eine völlig andere implementierung der addition, basierend auf der internen darstellung, also würde es weiter oben schlicht keine sinn manchenstell dir vor du hast eine implentierung in number manchmal schön
du willst eine andere haben, okay, dann kannst du sie überschreiben
und wenn du keine haben willst? überschreiben und exception?
sehr unschön