2015-11-11 2 views
-3

У меня вопрос относительно использования подстановочного знака. Я получил ошибку компиляции в строке «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()); 
    } 

} 
+0

Вопросы, ищущих отладки помощи ("** почему не этот код работает? ** ") должны включать в себя желаемое поведение, ** конкретную проблему ** с ** полным сообщением об ошибке и/или stacktrace ** и ** самым коротким кодом, необходимым **, чтобы воспроизвести его ** в самом вопросе ** , Вопросы без ** ясного заявления о проблеме ** не полезны для других читателей. См. [Как создать минимальный, полный и проверенный пример.] (Http://stackoverflow.com/help/mcve). –

+0

Ошибка отражена в вопросе, хотя я сделаю все возможное, чтобы отредактировать вопрос, чтобы было ясно. – Niminim

+0

Я не вижу полного сообщения об ошибке из stacktrace в вопросе где-нибудь –

ответ

3

Ваш метод печати определяет HashMap:

public void print(HashMap<? extends Item,Integer> map) 

Вы, вероятно, имел в виду использовать карту, если вы Попутно Карта ссылок:

public void print(Map<? extends Item,Integer> map) 
+0

Почему я не могу использовать HashMap в методе, если он объявлен как Map перед конструктором? – Niminim

+0

Потому что 'Карта' ** не **' HashMap' –

+0

Правильно, но HashMap реализует интерфейс карты, не так ли? – Niminim

Смежные вопросы