繁体   English   中英

HashMap 与 Map 参数类型

[英]HashMap vs Map parameter types

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

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

不能应用于

"java.util.Map< Game.MeleeWeapon,java.lang.integer>(对于 RangedWeapon 和 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());
    }

}

您的打印方法指定 HashMap:

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

如果您传递 Map 引用,您可能打算使用 Map:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM