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.Float

    sicher 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 zustandsprobleme

    ferner 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 manchen

    stell 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


Log in to reply