有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java HashMap与Map参数类型

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

爪哇。util。HashMap<?扩展游戏。项目,java。lang.integer>

不能应用于

“java.util.Map<;Game.meleeWearm,java.lang.integer>;(RangedWeapon和Armor也是如此)

然后我将这些对象的第一个声明从Map改为HashMap(在private之后),它解决了这个问题。问题是为什么?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) 个答案

  1. # 1 楼答案

    打印方法指定HashMap:

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

    如果您正在传递映射引用,则可能打算使用Map:

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