Generisches Factorial



  • Wie schreibt man ein generisches Factorial?



  • Was soll das sein?



  • Sowas hab ich gesucht aber das kompiliert nicht und weiß nicht warum?

    public static <T extends Comparable<T>> T factorial(T n){
    		assert n.compareTo(0) >= 0;
    
    		T result = new T(1);
    
    		for(int x=1; x<=n; ++x)
    			result *= x;
    
    		return result;
    	}
    


  • Die Compilermeldungen (warum postest Du die nicht mit???) sind doch eindeutig...

    Foo.java:3: error: incompatible types: int cannot be converted to T
            assert n.compareTo(0) >= 0;
                               ^
      where T is a type-variable:
        T extends Comparable<T> declared in method <T>factorial(T)
    

    Du sagst, dass T mit T vergleichbar ist, vergleichst dann aber T mit int.

    Foo.java:5: error: unexpected type
            T result = new T(1);
                           ^
      required: class
      found:    type parameter T
      where T is a type-variable:
        T extends Comparable<T> declared in method <T>factorial(T)
    

    new T kann nicht funktionieren, da T zur Laufzeit nicht mehr bekannt ist (type erasure)

    etc...



  • Aber wie mach ich das dann, wenn ich weder new T() noch 0 benutzen darf?



  • Naja, Generics und build-in Typen sind eh so eine Sache. Von daher würd ich sagen: Lass es...

    Wenn Du es aber trotzdem versuchen willst: Bau Dir erstmal eine nicht-generische Version, die mit BigInteger arbeitet. Dabei sollte Dir dann auffallen, was an Zeile 6/7 Mist ist.

    Um das ganze dann generisch zu machen, brauchst Du erstmal ein Interface, dass Dir garantiert, dass so etwas wie eine Multiplikation existiert. Und da wüsste ich jetzt nicht, dass es so was gibt.



  • Ok.
    Generics sind im Vergleich zu C++-Templates echt kacke!


Anmelden zum Antworten