tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
302
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Conkerchen Conkerchen ist offline Grünschnabel
    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
     

  2. #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ß Tom
     
    Java 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

  1. Generics Syntax
    Von Lastlord im Forum Java
    Antworten: 5
    Letzter Beitrag: 03.11.10, 08:50
  2. Generics
    Von bRainLaG im Forum Java
    Antworten: 3
    Letzter Beitrag: 09.12.09, 12:42
  3. Covariance für .Net Generics?
    Von Thomas Darimont im Forum .NET Café
    Antworten: 0
    Letzter Beitrag: 10.06.08, 15:44
  4. Generics Problem
    Von Iam_Fiction im Forum Java
    Antworten: 3
    Letzter Beitrag: 13.01.08, 14:59
  5. Casten von Generics
    Von dr-oetker im Forum Java
    Antworten: 2
    Letzter Beitrag: 13.04.07, 09:37