Interface Generics, Interfaces und Listen - ich bin verwirrt.

Keyno

Mitglied
Hallo, ich habe dieses Interface:

Java:
public interface Game<M extends Move> {
    /**
     * 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.
     */
    public List<M> getValidMoves();

[...]
}

Und das Interface Move:
Java:
public interface Move {
}

Meine ConnectFour (Vier Gewinnt) Klasse:
Java:
public class ConnectFour<M extends ConnectFourMove> implements Game<M> {

[...]
	@Override
	public List<M> getValidMoves() {
		ArrayList<M> list;
		int temp = -1;
		for (int i = 0; i < map.length; i++) {
			if (map[i][0] == 0) {
				Move move = new ConnectFourMove(i);	
				list.add(move);
			}
		}
		return list;
	}
[...]
}

Klasse ConnectFourMove:
Java:
public class ConnectFourMove implements Move {
	private static Player player;
	private int column;
	ConnectFourMove(int column) {
		this.setColumn(column);
	}
[...]
}


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.

Wie kann ich das Casten umgehen?

Danke, Keyno
 
Java:
public class ConnectFour<M extends ConnectFourMove> implements Game<M>

Warum definierst Du hier eine Type-Variable?
Du möchtest wahrscheinlich den Typ konkret binden:

Java:
public class ConnectFour implements Game<ConnectFourMove>
 
Zuletzt bearbeitet:
Hi,

Danke für die Antwort.

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".
 
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.

M ist in diesem Fall kein Typ, sondern eine Typ-Variable (das Wort Type-Parameter war schon besetzt).

Also ein Platzhalter, der in einem weiteren Schritt konkret belegt wird.

Java:
@Override
    public List<ConnectFourMove> getValidMoves() {
        ArrayList<ConnectFourMove> list;
        int temp = -1;
        for (int i = 0; i < map.length; i++) {
            if (map[i][0] == 0) {
                ConnectFourMove move = new ConnectFourMove(i); 
                list.add(move);
            }
        }
        return list;
    }
 
Achsoooo, ich darf den Type-Parameter selbst festlegen. 😀

Aus welchem Grund auch immer dachte ich, dass ich M aus dem Interface übernehmen muss :O

Vielen Dank^^ Funktioniert auf diese Weise natürlich einwandfrei 🙂
 
Hallo, ich habe dieses Interface:

Java:
public interface Game<M extends Move> {
    /**
     * 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.
     */
    public List<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:
class Game{
    public List<? extends Move> getMoves();
}

Die gültigen Moves hängen ja von der Situation und nicht vom Spiel ab.
 
Hi Sebastian,


Wir haben ein Interface vorgelegt bekommen, das wir nicht verändern dürfen.
Anhand dieses Interfaces müssen wir Vier Gewinnt programmieren.

Daher das Generic Interface.
Sehr nervig, wenn man nicht seine eigenen Methoden definieren darf :/
 

Neue Themen


Zurück
Oben