HashMap与Map参数类型

时间:2015-11-11 21:35:22

标签: java types

我有一个关于使用通配符的问题。我在交换机的“case 3:”行中出现了编译错误(非法启动表达式),但这可能不是问题的根源。 我在meleeMap下面看到一条红线,另外两个参数是“print”方法

的java.util.HashMap< ?扩展了Game.Item,java.lang.integer>

无法应用于

“java.util.Map< Game.MeleeWeapon,java.lang.integer>(和RangedWeapon and Armor一样)。

然后我将这些对象的第一个声明从Map更改为HashMap(在私有之后),它解决了问题。问题是为什么? HashMap实现了Map接口,所以我认为它应该可以在不改变Map到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());
    }

}

1 个答案:

答案 0 :(得分:3)

您的print方法指定HashMap:

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

如果您传递地图引用,则可能意味着使用Map:

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