Вот идея:
Имеет интерфейс Sport
/ абстрактный класс:
interface Sport {
}
и три класса, которые реализуют Sport
:
class Football implements Sport {}
class Basketball implements Sport {}
class Volleyball implements Sport {}
Теперь у вас может быть Team<T extends Sport>
:
public abstract class Team<T extends Sport> {
Метод matchResult
необходимо изменить на:
public void matchResult(Team<T> opponent, Integer homeScore, Integer awayScore) {
Ваши конкретные классы команд будут объявлены так:
public class FootballTeam extends Team<Football> { ... }
public class BasketballTeam extends Team<Basketball> { ... }
public class VolleyballTeam extends Team<Volleyball> { ... }
При таком дизайне FootballTeam
не может играть против BasketballTeam
, но может играть против Team<Football>
, что, я думаю, имеет смысл. Правильно? Во время выполнения Team<Football>
должно быть FootballTeam
, если вы не пишете больше классов.
Немного отвратительно то, что у вас теперь есть этот странный тип Team<Sport>
, но вы не можете создать в любом случае, если вы не напишите больше классов.