publicinterfaceGame<MextendsMove>{/**
* Calculates and returns the list of possible moves
* among which the active player can choose.
* If the game is over (one player has won) or no move
* is possible the list is empty.
* @return the list of possible moves.
*/publicList<M>getValidMoves();[...]}
Und das Interface Move:
Java:
publicinterfaceMove{}
Meine ConnectFour (Vier Gewinnt) Klasse:
Java:
publicclassConnectFour<MextendsConnectFourMove>implementsGame<M>{[...]@OverridepublicList<M>getValidMoves(){ArrayList<M> list;int temp =-1;for(int i =0; i < map.length; i++){if(map[i][0]==0){Move move =newConnectFourMove(i);
list.add(move);}}return list;}[...]}
Meine getValidMoves() soll dabei in einem Vier Gewinnt berechnen, ob die erste Zeile gefüllt ist. Wenn sie nicht gefüllt ist, wird die Spaltennummer in die Liste übertragen. Ein Move ist ein Zug, den ein Spieler tätigt.
Ich habe nur das Problem, dass ich bei der Methode getValidMoves() den Move casten muss, damit ich ihn zur List<M> hinzufügen kann.
Naja, weil ich ja irgendwie den Typ M einbinden muss. Ich muss mich ja ans Interface halten. D.h. es muss eine List<M> mit M geben.
Oder wie kann ich das anders einbinden?
Wenn ich die Klasse ConnectFour so definiere wie Du gerade meintest, erhalte ich von Eclipse den Error "M cannot be resolved to a type".
publicinterfaceGame<MextendsMove>{/**
* Calculates and returns the list of possible moves
* among which the active player can choose.
* If the game is over (one player has won) or no move
* is possible the list is empty.
* @return the list of possible moves.
*/publicList<M>getValidMoves();[...]}
IMHO ist diese Definition schon falsch. Die Art der gültigen Moves hängt doch nicht vom Spiel ab, oder? Und getValidMoves() liefert auch nicht immer extakt dieselben Typen von Moves zurück?
Warum glaubst du benötigst du den Generic in der Klassendeklaration?
Wäre nicht folgendes besser geeignet?
Java:
classGame{publicList<?extendsMove>getMoves();}
Die gültigen Moves hängen ja von der Situation und nicht vom Spiel ab.