OOP Generik, aber wie?

DarkManX

Mitglied
Hiho Leute,

versuche mir gerade zum Übung Matrizenoperationen in einer Klasse zu definieren, klappt soweit alles gut, nur habe ich jetzt ein Problem die richtige Organisation dafür zu finden.

Habe zuerst die Klasse MatrixDouble erstellt und dort alle Operationen für Doubles definiert. Danach fand ich diese Gleitkommazahlen nicht gerade vorteilhaft für die Anschauung. Also müssen Brüche her. Promt habe ich die Klasse Bruch geschrieben, die die Brüche darstellt und auch Operationen dafür definiert. Danach die Klasse MatrixBruch erstellt und das selbe analog für Doubles gemacht.

Nun habe ich 2 Klassen MatrixDouble und MatrixBruch, diese könnte man doch zu einer vereinigen um Redundanz zu vermeiden, nur habe ich nicht den Clou wie. Kann mir einer vlt paar Tips dafür geben?

Danke!
 

Antoras

Top Contributor
Du definierst eine generische Klasse über einen Typparameter: [c]class Matrix<T> {}[/c]

Jetzt musst du nur überall dort wo in deiner Klasse ein Double oder ein Bruch steht den Typparameter T verwenden, z.B. [c]public Matrix<T> add(Matrix<T> m) {}[/c].

Eine sehr gute Übersicht über Java-Generics findest du hier.
 

DarkManX

Mitglied
Was Generik ist und wie man das macht ist mir eig. recht klar. Das Problem wäre bei der Implementierung, ich bei Bruch sowas wie bruch1.add(bruch2) oder Bruch.add(bruch1,buch2) verwende. Wie soll es denn mit Doubles funktionieren? Muss ich dann noch diese Methoden für Doubles definieren? Weil bei Doubles habe ich ja ja einfach z1+z2.

PS: Kann man eig für einen Datentyp irgendwie die Operation "+" oder "*" definieren? Dass bruch1*bruch2 = Bruch.mult(bruch1,bruch2) ist?
 

Landei

Top Contributor
Das erste Problem bei der Sache ist, dass die Wrapper-Objekte wie Double keine mathematischen Methoden definieren. Also braucht man in diesem Fall auch ein Objekte, die für die verschiedenen Zahlentypen "rechnen" können, Werte für die Null und die Eins u.s.w. Das zweite Problem ist, dass du die Daten der Matrix sicher in einem Array abspeichern willst, nur lässt sich ein Array leider nicht für einen generischen Typ erzeugen (Stichwort "type erasure"). In unserem Fall können wir das unsere Rechenklasse gleich mit übernehmen lassen. Das dritte Problem ist die Performance: Gerade bei Matritzen würde man in der Praxis aus Geschwindigkeitsgründen Primitive wie double vorziehen, das andauernde Boxing/Unboxing (Double <=> double) geht mächtig auf die Geschwindigkeit.

Trotzdem mal der Versuch einer Skizze:
Java:
public interface Operations<T> {
   public T zero();
   public T one();
   public T add(T a, T b);
   public T mult(T a, T b);
   //und alle anderen Operationen, die du für deinen Zahlentyp benötigst

   public T[][] makeArray(int columns, int rows);
}

//Eine Implementierung für Double (ananlog dann für Bruch)
public class DoubleOps implements Operations<Double> {
   public T zero(){ return 0.0; }
   public T one(){ return 1.0; }
   public Double add(Double a, Double b){ return a+b; }
   public Double mult(Double a, Double b){ return a*b; }

   public Double[][] makeArray(int columns, int rows){ return new Double[columns][rows]; } 
}

public class Matrix<T> {
   final T[][] data;
   final Operations<T> ops;
   final int columns; 
   final int rows; 

   public Matrix(int columns, int rows, Operations<T> ops) {
        this.ops = ops;
        this.columns = columns;
        this.rows = rows;
        data = ops.makeArray(columns,rows); 
        for(int x = 0; x < columsn; x++) {
           for(int y = 0; y < columns; y++) {
               data[x][y] = ops.zero(); 
           }
        }
   }

   //mal ein Beispiel für eine Addition, die eine neue Matrix liefert 
   //(oft gibt es auch eine Version, die stattdessen die lokale Matrix ändert)
  public Matrix T add(Matrix<T> that) {
     assert this.columns == that.columns && this.rows == that.rows;
     Matrix<T> result = new Matrix<T>(columns, rows, ops);
        for(int x = 0; x < columsn; x++) {
           for(int y = 0; y < columns; y++) {
               result.data[x][y] = ops.add(this.data[x][y], that.data[x][y]); 
           }
        }
        return result;
  }
}

Wie du siehst, kann unsere Matrix ganz allgemein verwendet werden, selbst für eigene Datentypen, zumindest solange eine entsprechende Operations-Instanz zur Verfügung steht.

Eine andere Variante wäre, die benötigten Operationen wie add abstrakt in Matrix aufzunehmen, und dann in den Unterklassen zu definieren, etwa [c]public class DoubleMatrix extends matrix<Double>{...[/c]. Der Vorteil eines separaten Operations-Interfaces ist, dass es "wiederverwendbar" ist, z.B. wenn du generische Vektoren, Polynome u.s.w. implementieren willst.
 
Zuletzt bearbeitet:

DarkManX

Mitglied
Hmm, also ich habe bis jetzt immer alle Arrays mit generischen Typen als Arrays vom Typ Object erstellt und diese zu diesem Typen gecastet. Warum soll das nicht gehen?
Java:
T[][] matrix = (T[][]) new Object[x][y];
Auf Performance achte ich gerade gar nicht, da ich nur eine Matrix auf Eigenschaften analysieren will (Stufenform, Determenante, inverse Matrix, usw.). Also ursprünglich dachte ich, man kann den generischen Typen von irgendeinem mathematischem Typ ableiten oder so, damit diese Operationen definiert sind. So könnte man machen Matrix<T extends IrgendEineMathKlasseOderSo> und die Bruchklasse würde man dann auch von dieser Klasse ableiten. Geht das irgendwie? Gibt es so eine Klasse?
 

Marco13

Top Contributor
Leider nicht. Ein Interface wie "FieldElement" wäre natürlich schön. Idealerweise vollkommen transparent auch für primitive Typen "implementiert". DORT würde Operatorenüberladung dann wenigstens Sinn machen :) Es gibt Ansätze, die in diese Richtung gehen ( org.jscience.mathematics.structure (JScience 5.0-SNAPSHOT API) ) aber leider schieben einem die sprachlichen Beschränlungen bei Java da schnell einen Rigel vor, bzw. machen das ganze sehr schwierig und kaum performant umsetzbar, eben durch die Trennung zwischen primitiven und Referenztypen...
 

DarkManX

Mitglied
Ok gut, werde das mal mit abstrakten Klassen versuchen, damit man den Mist, den ich gerade verzapfe auch mal weiterverwenden kann. Hatte vor einen Matrixrechner für mein Handy zu machen, klappt auch ganz gut, wollte es aber besser organisieren.

Wo man gerade dabei ist, hätte ich noch eine Frage:
Gibt es irgendwelche Libs, mit denen man ohne weiteres mathematische Formeln darstellen kann? Sodass mir das Ding ein Bild von der Matrix erzeugt (schön mit Klammern und die Koeffizienten richtig positioniert) und ich es wiedergeben kann. Wenn ich nun eigene Bilder für Klammern importieren würde und die als Flanken der Matrixtabelle anzeigen würde, bräuchte ich für jede beliebige n x m Matrix lange Klammern. Hoffe einer hat guten Rat!

Danke
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Warum funktioniert die Lösung von CodeGym aber meine nicht? Java Basics - Anfänger-Themen 3
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
T float soll durch schleife die größte mögliche Zahl herausfinden, Ausgabe ist aber "Infinity" Java Basics - Anfänger-Themen 1
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
M Konstruktor-Aufruf im Konstruktor, aber nicht am Anfang? Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
H Kapselung protected aber in einer Kindklasse nicht zugänglich Java Basics - Anfänger-Themen 5
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
P Installation JRE 8u321 startet, geht aber nicht weiter Java Basics - Anfänger-Themen 1
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
L Mergesort (aber anders) Java Basics - Anfänger-Themen 2
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
HelpInneed Baum ausgeben (aber mal anders) Java Basics - Anfänger-Themen 3
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
H Kapselung JProgressBar in JTable, aber getValueAt() greift nicht Java Basics - Anfänger-Themen 7
U Den Kuchen aufteilen - aber wie? (Rebalancing-Algorithmus) Java Basics - Anfänger-Themen 14
OSchriever Jar-Programm läuft auf Windows aber nicht auf Linux(Raspberri Pi4) Java Basics - Anfänger-Themen 22
R Fehlermeldung aber WO liegt der Fehler? Java Basics - Anfänger-Themen 7
I DecimalFormat in Zahlenformat für Währung, habe 7,99, bekomme aber 7 Java Basics - Anfänger-Themen 4
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
AGW App programmiert lassen, aber Änderungen vornehmen Java Basics - Anfänger-Themen 13
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Fehler, aber ich weiß nicht warum Java Basics - Anfänger-Themen 3
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
B Java Mail -> Mail senden, ist aber nich in IMAP unter "Gesendet" Java Basics - Anfänger-Themen 3
A Figur erkennen, aber Abweichung falsch Java Basics - Anfänger-Themen 2
A Haben KNNs ein Gedächtnis, lernen etwas oder verändern sich, während sie nicht trainieren, aber aktiv sind? Java Basics - Anfänger-Themen 3
C "HelloWorld" - Dateien erstellt, aber ist es eine class-Datei? Java Basics - Anfänger-Themen 2
S Programmierung simulieren - aber wie?! Java Basics - Anfänger-Themen 3
S Interpreter-Fehler Endlosschleife zur Laufzeit aber warum? Java Basics - Anfänger-Themen 15
J Mit OpenJDK entwickeln aber Oracle SE Runtime installieren? Java Basics - Anfänger-Themen 6
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
A Java-Programm läuft bei installierter JDK aber nicht mit JRE? Java Basics - Anfänger-Themen 5
C Statischer Typ aber Variable nicht statisch? Java Basics - Anfänger-Themen 5
J ShortCut erstellen aber wie die dll einbinden Java Basics - Anfänger-Themen 3
I "\n" aus ArrayList enfernen, aber wie?! Java Basics - Anfänger-Themen 4
B Türme von Hanoi mit einer beliebigen aber gültigen Eingabe lösen Java Basics - Anfänger-Themen 5
S JDK 9 für Windows 32 bit installiert, aber es funktioniert nix Java Basics - Anfänger-Themen 6
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
U Null Exception aber keine Ahnung warum Java Basics - Anfänger-Themen 5
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
J JavaEditor kompiliert aber startet nicht Java Basics - Anfänger-Themen 1
B Email versand - aber akzeptiert auch falscher Username und Passwort??? Java Basics - Anfänger-Themen 1
O Array benutzen aber WIE? Java Basics - Anfänger-Themen 18
E Mastermind programmieren, wie den falschen Platz aber richtige Farbe schecken? Java Basics - Anfänger-Themen 23
A Variabler Rekursionsaufruf, aber wie? Java Basics - Anfänger-Themen 6
N Ausführung gibt keinen Fehler an, Return wird aber nicht ausgegeben Java Basics - Anfänger-Themen 22
M Methoden Zwei Methoden in einem Program laufen lassen...aber wie? Java Basics - Anfänger-Themen 2
K Armstrong Programm geht nur bis 1000, aber nicht weiter Java Basics - Anfänger-Themen 2
pkm Best Practice BufferedImage in JPane darstellen - aber wie? Java Basics - Anfänger-Themen 22
it_is_all Bild-Pfad wird gefunden, nicht aber Textdatei-Pfad Java Basics - Anfänger-Themen 8
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
D int x in System.out.println(), aber wie? Java Basics - Anfänger-Themen 1
J Serialisieren, aber wie? Java Basics - Anfänger-Themen 3
A Warum funktioniert switch aber nicht if/else? Java Basics - Anfänger-Themen 23
T Datum wird auf der Konsole richtig ausgegeben, aber im Textarea kommt ERROR Java Basics - Anfänger-Themen 8
snipesss Java-Code gedownloaded, funktioniert aber nicht? Java Basics - Anfänger-Themen 9
H NullPointerException, aber wieso? Java Basics - Anfänger-Themen 5
P Irgendein billiger Fehler aber ich find ihn nicht Java Basics - Anfänger-Themen 16
Thallius Date für DatePicker formatieren aber wie? Java Basics - Anfänger-Themen 9
J Nullpointer aber wo? Java Basics - Anfänger-Themen 12
E Dumme Frage, aber... Java Basics - Anfänger-Themen 15
S Erste Schritte Generische Klassen sind toll ....aber warum sollte ich das je benutzen? Java Basics - Anfänger-Themen 3
Z Erste Schritte Versuche ein Labyrinth in einem Terminal zu erstellen, aber kann die properties Datei nicht einlesen Java Basics - Anfänger-Themen 3
Tacofan Schleife aber nur wie? Java Basics - Anfänger-Themen 10
V char Eingabe aber nur für Buchstaben Java Basics - Anfänger-Themen 4
J Eine Art verkettete Liste aber mit teils mehr als einem Nachfolger Java Basics - Anfänger-Themen 8
J Programm funktioniert aber unsafe operations? Java Basics - Anfänger-Themen 3
F java.lang.NullPointerException, kann aber nicht sein! Java Basics - Anfänger-Themen 4
GadgetSofa jComboBox mit dem Button verbinden. Aber wie?? Java Basics - Anfänger-Themen 4
GadgetSofa IOException fehlt aber wo einfügen? Java Basics - Anfänger-Themen 6
J TCP MultiThreaded Server und Client - irgendwo ist der Fehler, aber ich find ihn nicht Java Basics - Anfänger-Themen 3
J Threading-Aufgabe. Totale Noob Fragen, aber bitte trotzdem beantworten ;) Java Basics - Anfänger-Themen 7
I erstelle Vorschaubild mit der lib PDF-Renderer und möchte danach Dateiname ändern -> geht aber nicht Java Basics - Anfänger-Themen 0
D 0 Point Exeption... aber warum? Java Basics - Anfänger-Themen 3
D Compiler-Fehler NullPointerExeption aber Ecplise zeigt keine Fehler an?! Java Basics - Anfänger-Themen 8
A Int Eingabe: String mit Exception abfangen. Aber wie? Java Basics - Anfänger-Themen 3
A Ping Pong Score Zähler,aber wie? Java Basics - Anfänger-Themen 3
Z Zwei Images auf einem JFrame - Aber nur eins wird angezeigt! Java Basics - Anfänger-Themen 5
S OOP Die Methode funktioniert, aber wieso? Java Basics - Anfänger-Themen 2
I Programm testen, aber wie? Java Basics - Anfänger-Themen 14
T String simpel aber sicher verschlüsseln Java Basics - Anfänger-Themen 5
I ZIP Archive erstellen - ich möchte aber nur den jeweiligen Ordner zippen, bekomme ganzen Pfad Java Basics - Anfänger-Themen 1
H [erledigt] Variable initialisiert, aber nicht verfügbar (Schleife) Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
V Arrays aus eigener Klasse erstellt, zuweisung aber spuckt Fehler in verbindung mit main Methode aus. Java Basics - Anfänger-Themen 3
B Array erstellen,ausgeben,mit zufallszahlen füllen aber wie ? Java Basics - Anfänger-Themen 1
T webapp aber wie... Java Basics - Anfänger-Themen 7
O Verriegeln, aber wo? Finde den Client der zu schließem ist. Java Basics - Anfänger-Themen 0
F Fehler in der Swich-Anweisung aber Warum? Java Basics - Anfänger-Themen 4
M Erzeugen beliebig vieler Objekte, aber wie wechselnde Bezeichner? Java Basics - Anfänger-Themen 5
C Slideshow Übergänge - aber wie? Java Basics - Anfänger-Themen 3
F String wird richtig in konsole geschrieben aber falsch an Methode übergeben Java Basics - Anfänger-Themen 8
J Vererbung Kleiner Fehler, weiß aber nicht warum und wo Java Basics - Anfänger-Themen 9
A Klassen JTextField eigtl leer aber es werden Methoden ect. angezeigt Java Basics - Anfänger-Themen 9
K Variablen Instanzen gleich aber warum ? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben