Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Java ::  Generisches Factorial     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
nutzername
Unregistrierter




Beitrag nutzername Unregistrierter 16:21:27 17.09.2016   Titel:   Generisches Factorial            Zitieren

Wie schreibt man ein generisches Factorial?
SG1
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.03.2001
Beiträge: 3073
Beitrag SG1 Mitglied 18:10:02 17.09.2016   Titel:              Zitieren

Was soll das sein?
nutzername
Unregistrierter




Beitrag nutzername Unregistrierter 18:14:52 17.09.2016   Titel:              Zitieren

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

Java:
1
2
3
4
5
6
7
8
9
10
    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;
    }
SG1
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.03.2001
Beiträge: 3073
Beitrag SG1 Mitglied 18:52:35 17.09.2016   Titel:              Zitieren

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

Code:
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.

Code:
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...
nutzername
Unregistrierter




Beitrag nutzername Unregistrierter 19:27:19 17.09.2016   Titel:              Zitieren

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

Benutzerprofil
Anmeldungsdatum: 19.03.2001
Beiträge: 3073
Beitrag SG1 Mitglied 19:49:45 17.09.2016   Titel:              Zitieren

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.
nutzername
Unregistrierter




Beitrag nutzername Unregistrierter 20:11:28 17.09.2016   Titel:              Zitieren

Ok.
Generics sind im Vergleich zu C++-Templates echt kacke!
C++ Forum :: Java ::  Generisches Factorial   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.