У меня вопрос относительно использования подстановочного знака. Я получил ошибку компиляции в строке «case 3:» в коммутаторе (незаконный запуск выражения), но это, вероятно, не является корнем проблемы. Я увидел красную линию под meleeMap и два других аргумента, которые «печатают» методHashMap vs Параметры параметров карты
java.util.HashMap <? расширяет Game.Item, java.lang.Integer>
не может быть применен к
«java.util.Map < Game.MeleeWeapon, java.lang.Integer> (и то же самое для RangedWeapon и брони) .
Затем я изменил первое объявление этих объектов с карты на HashMap (после приватного) и решил проблему. Вопрос в том, почему? HashMap реализует интерфейс карты, поэтому я подумал, что он должен работать без изменения карты к HashMap, но это не сработало.
public class Blacksmith {
private Map<MeleeWeapon,Integer> meleeMap;
private Map<RangedWeapon,Integer> rangedMap;
private Map<Armor,Integer> armorMap;
Blacksmith() {
meleeMap = new HashMap<MeleeWeapon, Integer>();
List<MeleeWeapon> meleeList = MeleeWeapon.meleeWeaponList;
for (MeleeWeapon weapon : meleeList) {
meleeMap.put(weapon, 5);
}
rangedMap = new HashMap<RangedWeapon, Integer>();
List<RangedWeapon> rangedList = RangedWeapon.rangedWeaponList;
for (RangedWeapon weapon : rangedList) {
rangedMap.put(weapon, 5);
}
armorMap = new HashMap<Armor, Integer>();
List<Armor> armorList = Armor.armorList;
for (Armor armor : armorList) {
armorMap.put(armor, 2);
}
}
public void sell(Character customer, Item item){
System.out.println("1. Melee Weapons");
System.out.println("2. Ranged Weapons");
System.out.println("3. Armors");
Scanner scanner = new Scanner(System.in);
int scan = scanner.nextInt();
switch(scan) {
case 1:
print(meleeMap);
break;
case 2:
print(rangedMap);
break;
case 3:
print(armorMap);
default:
System.out.println("Wrong input");
}
}
public void print(HashMap<? extends Item,Integer> map){
for (Item item : map.keySet()){
System.out.println(item.getName());
}
}
Вопросы, ищущих отладки помощи ("** почему не этот код работает? ** ") должны включать в себя желаемое поведение, ** конкретную проблему ** с ** полным сообщением об ошибке и/или stacktrace ** и ** самым коротким кодом, необходимым **, чтобы воспроизвести его ** в самом вопросе ** , Вопросы без ** ясного заявления о проблеме ** не полезны для других читателей. См. [Как создать минимальный, полный и проверенный пример.] (Http://stackoverflow.com/help/mcve). –
Ошибка отражена в вопросе, хотя я сделаю все возможное, чтобы отредактировать вопрос, чтобы было ясно. – Niminim
Я не вижу полного сообщения об ошибке из stacktrace в вопросе где-нибудь –