2016-03-30 5 views
4

Ich versuche, eine Matrix-Bibliothek (Bildungszweck) zu erstellen und ein Hindernis erreicht habe ich bin mir nicht sicher, wie man mit Gnade zu nähern. Hinzufügen von zwei Matrizen ist eine einfache Aufgabe, mit einer Methode get() auf jedem einzelnen Elemente der Matrizen einzeln.Abstrakte Klassenmethode - Um Kind Klassenobjekt zu instanziieren?

Die Syntax, die ich verwendet habe, ist jedoch falsch. NetBeans behauptet, dass es eine Klasse erwartet, aber einen Typparameter gefunden hat; Für mich ist ein Typparameter nur ein Satz mit 1: 1 Mapping auf die Menge der Klassen.

Warum liege ich hier falsch? Ich habe noch nie gesehen, dass ein Typparameter etwas anderes als eine Klasse zuvor ist, also sollte das folgende Bit nicht bedeuten, dass M eine Klasse ist?

M erweitert Matrix

public abstract class Matrix<T extends Number, M extends Matrix> 
{ 
    private int rows, cols; 
    public Matrix(int rows, int cols) 
    { 
     this.rows = rows; 
     this.cols = cols; 
    } 

    public M plus(Matrix other) 
    { 
     // Do some maths using get() on implicit and explicit arguments. 
     // Store result in a new matrix of the same type as the implicit argument, 
     // using set() on a new matrix. 
     M result = new M(2, 2); /* Example */ 
    } 

    public abstract T get(int row, int col); 
    public abstract void set(int row, int col, T val); 
} 
+1

Warum hat die Matrix-Klasse einen Typ, der sich erweitert? –

+0

@ cricket_007 Meine Argumentation ist, dass die Funktion plus() ein Objekt zurückgeben sollte, dessen Klasse Matrix erweitert. Es klingt jetzt wirklich albern, dass ich es austippe. Vielleicht sollte der Rückgabetyp nur Matrix sein. Aber dann kann ich keine Matrix innerhalb der plus() Funktion instanziieren, oder? Wie es eine abstrakte Klasse ist. –

+2

Sie können einen Typparameter 'M' nicht direkt instanziieren, weil Sie seinen genauen Typ nicht kennen. – Andrew

Antwort

2

Sie können einen Typparameter M nicht direkt instanziieren, weil Sie seinen genauen Typ nicht kennen.


Ich schlage vor, darüber nachzudenken, die folgende Methode zu schaffen

public abstract <M extends Matrix> M plus(M other); 

und deren Umsetzung in der Unterklasse.

0

Ich glaube nicht, Ihre M notwendig ist. Wenn die M eine Unterklasse von Matrix ist, dann verwenden Sie einfach Matrix in Ihrer Definition.

public abstract class Matrix<T extends Number> 
{ 
    private int rows, cols; 
    public Matrix(int rows, int cols) 
    { 
     this.rows = rows; 
     this.cols = cols; 
    } 

    public Matrix<T> plus(Matrix<T> other) 
    { 
    } 

    public abstract T get(int row, int col); 
    public abstract void set(int row, int col, T val); 
} 
0

Der folgende Code ist falsch:

M result = new M(2, 2); 

M nicht eine Klasse, die Sie instanziieren.

Grundsätzlich müssen Sie Ihre Datenstruktur etwas ändern, da Ihre Matrix Klasse abstract ist und auch nicht instanziiert werden kann!

Ich empfehle Ihnen, den Rückgabetyp von plus zu Matrix zu ändern und es abstrakt zu lassen.

2

Aus Ihrem Code, ich denke, Sie möchten einige Kind-Klasse aus Matrix erweitern und Berechnung für sie tun.

Wechsel zu

public abstract class Matrix<T extends number> { 
    ... 
    public abstract Matrix plus(Matrix other); 
    ... 
} 

In jedem Kind-Klasse, die Umsetzung von plus hinzuzufügen. Aufgrund der Konstruktionsfunktion ist die Kindklasse dort definiert.