Есть два класса EJPlayer (Интерфейс) и EPlayer (Дочерний)
Есть массив ConcurrentHashMap<String,? extends EJPlayer>
По логике EPlayer же должен помещаться в этот массив? По итогу ошибка в методе put(k,v)
Код:
public class EPlayer implements EJPlayer {
protected static ConcurrentHashMap<String,? extends EJPlayer> registeredEPlayers = new ConcurrentHashMap<>();
public static EJPlayer registerEPlayer(Player p) {
return EPlayer.registeredEPlayers.put(p.getName(), new EPlayer(p)); // Ошибка тут
}
public static EJPlayer getEPlayer(Player p) {
if (EPlayer.registeredEPlayers.containsKey(p.getName()))
return EPlayer.registeredEPlayers.get(p.getName());
else
return EPlayer.registerEPlayer(p);
}
}
Класс EJPlayer (Методы указанные тут есть в EPlayer)
public interface EJPlayer {
public Player getPlayer();
public ReadOnlySettings getSettings();
}
Как решить вашу проблему:
Конкретно ваша задача решается использованием базового типа в рамках generic'а вместо wildcard, как вы и описали выше:
protected static ConcurrentMap<String, EJPlayer> registeredEPlayers = new ConcurrentHashMap<>();
Рекомендации:
ConcurrentMap (возможно, вам даже будет достаточно и просто интерфейса Map), а не ConcurrentHashMap.Map'ой, потенциально, не должно никогда переприсваиваться, то лучше сразу объявите его как final (тогда по рекомендациям и переменную назовете в верхнем регистре, т.к. она станет static final).Про wildcard generics:
Вопрос же касательно wildcard generic'ов, на самом деле, совсем нетривиальный.
Если вкратце, то существует принцип The Get and Put Principle, он же PECS (Producer Extends Consumer Super)):
extends, то это producer. Он только предоставляет элемент из контейнера, а сам ничего не принимает (за исключением null).super, то это consumer. Он только принимает, а предоставить ничего не может (за исключением Object).Подробнее с этой особенностью wildcard generic в Java можете ознакомиться здесь и здесь.
Поменял <String,? extends EJPlayer> на <String,EJPlayer> и всё заработало.. Извиняюсь за флуд в ленте)
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости