Есть два класса 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>
и всё заработало.. Извиняюсь за флуд в ленте)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Только начинаю постигать полезности тестированияПеречитал много ответов здесь и в гугле в целом, но ответа не нашел
Не получается задать относительный путьПосле создания артефакта (IDEA) при открытии сессии выводит ошибку: javax