ERLEDIGT
NEIN
NEIN
ANTWORTEN
1
1
ZUGRIFFE
302
302
EMPFEHLEN
-
31.05.09 09:04 #1
- Registriert seit
- May 2009
- Beiträge
- 1
Habe eine Frage zu Generics. Am Besten erkläre ich es direkt mal an dem Beispiel, an dem ich gerade dran bin:
Ich habe eine Klasse Matrix zur Rechnung mit Matrizen. Hier möchte ich, dass als Einträge ausschließlich Elemente eingefügt werden können, die auch Elemente eines Körpers bzw. einer algebraischen Struktur sind, auf der zumindest zwei Operationen add und mult definiert sind. Als Körper habe ich jetzt eine Klasse Rational, die diese Eigenschaft erfüllt.
Jetzt habe ich außerdem eine Klasse Körper, von der Rational erbt, um in den Kreis der möglichen Elemente der Matrix mit aufgenommen zu werden.
Mein großes Problem ist nun, dass ich nicht weiß, wie ich meine Matrix initialisieren kann. Der code sieht wie folgt aus:
Code :1 2 3 4 5 6 7 8
public Matrix initZero () { for (int i = 0; i < line; i++) { for (int j = 0; j < col; j++) { value[i][j] = ? } } return this; }
Wie bekomme ich da jetzt eine Null rein? Also nicht die Integer-Null, auch nicht die null-Referenz (die ist ja schon drin). Ich möchte, dass entsprechend des Typs, den diese Matrix aufnimmt, das entsprechende Null-Element des Körpers eingefügt wird. Ich habe das mit Generics gemacht, was beim Einfügen auch ganz gut funktioniert. Alles, was nicht dem Typ der Matrix entspricht, wird schon zur Compile-Zeit für die Einfüge-Operation Abgelehnt.
Aber an dieser Stelle will ich aber ja nicht sicherstellen, dass ein entsprechender Typ beim Afuruf der Methode initZero() verlangt wird, sondern ich will, dass initZero() das Null-Element der Klasse des jeweiligen Typs herausfischt. Also etwa so:
Code :1
value[i][j] = Field<Type>.ZERO.clone();
So geht es aber anscheinend nicht. Wie komme ich an das entsprechende Nullelement der Klasse Type? Oder mache ich hier grundsätzlich alles total falsch und verkehrt?Geändert von Conkerchen (31.05.09 um 09:05 Uhr) Grund: Vertippt
-
31.05.09 19:18 #2
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.885
- Blog-Einträge
- 29
Hallo,
wie wärs denn damit?
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
package de.tutorials; import java.lang.reflect.Array; public class AlgebraicExample { /** * @param args */ public static void main(String[] args) { Matrix<Real> matrix = Matrix.create(3, 3, Real.ZERO); System.out.println(matrix); } static interface SupportsMult<T extends SupportsMult<T>> { T mult(T other); } static interface SupportsAdd<T extends SupportsAdd<T>> { T add(T other); } static interface Field<T extends Field<T>> extends SupportsAdd<Real>, SupportsMult<Real>{ T zero(); T one(); } static class Matrix<T extends Field<T>> { int rows; int columns; T initialValue; T[][] data; @SuppressWarnings("unchecked") public Matrix(int rows, int columns, T initialValue) { this.rows = rows; this.columns = columns; this.initialValue = initialValue; this.data = (T[][]) Array.newInstance(initialValue.getClass(), rows, columns); init(this.initialValue); } public static <T extends Field<T>> Matrix<T> create(int rows, int columns, T initialValue){ return new Matrix<T>(rows,columns,initialValue); } private void init(T initValue){ for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { data[i][j] = initValue; } } } public void set(int i, int j, T value){ data[i][j] = value; } public T get(int i, int j){ return data[i][j]; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("{"); sb.append("\n"); for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { sb.append(data[i][j]); if (j + 1 < columns) { sb.append(","); } } sb.append("\n"); } sb.append("}"); return sb.toString(); } } static class Real implements Field<Real> { public final static Real ZERO = new Real(0.0); public final static Real ONE = new Real(1.0); private final double value; public Real(double value) { this.value = value; } public Real add(Real other) { return new Real(this.value * other.value); } public Real minus(Real other) { return new Real(this.value - other.value); } public Real mult(Real other) { return new Real(this.value * other.value); } public Real div(Real other) { return new Real(this.value / other.value); } public Real one() { return ONE; } public Real zero() { return ZERO; } @Override public String toString() { return String.valueOf(value); } } }
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
Ähnliche Themen
-
Generics Syntax
Von Lastlord im Forum JavaAntworten: 5Letzter Beitrag: 03.11.10, 08:50 -
Generics
Von bRainLaG im Forum JavaAntworten: 3Letzter Beitrag: 09.12.09, 12:42 -
Covariance für .Net Generics?
Von Thomas Darimont im Forum .NET CaféAntworten: 0Letzter Beitrag: 10.06.08, 15:44 -
Generics Problem
Von Iam_Fiction im Forum JavaAntworten: 3Letzter Beitrag: 13.01.08, 14:59 -
Casten von Generics
Von dr-oetker im Forum JavaAntworten: 2Letzter Beitrag: 13.04.07, 09:37





Zitieren

Login





