Java HashMap与Map参数类型

Java HashMap与Map参数类型,java,types,Java,Types,我有一个关于使用通配符的问题。我在开关中的“case3:”行(表达式的非法启动)中遇到编译错误,但这可能不是问题的根源。 我在meleeMap和“print”方法的另外两个参数下看到一条红线 java.util.HashMap 不适用于 java.util.Map(RangedWeapon和Armor也是如此) 然后我将这些对象的第一个声明从Map更改为HashMap(在私有之后),它解决了这个问题。问题是为什么?HashMap实现了Map接口,所以我认为它应该在不将Map更改为HashMap的

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

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

不适用于

java.util.Map(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());
    }

}
公共级铁匠{
私人地图;
私有地图范围地图;
私有地图;
铁匠{
meleeMap=newhashmap();
List meleeList=MELEEEWEARM.MELEEEWEARMONLIST;
用于(近战武器:近战名单){
放(武器,5);
}
rangedMap=新的HashMap();
List rangedList=RangedWeapon.rangedWeaponList;
用于(远程武器:远程列表){
射程地图放置(武器,5);
}
armorMap=newHashMap();
列表armorList=Armor.armorList;
用于(装甲:装甲列表){
盔甲地图放置(盔甲,2);
}
}
公开作废销售(角色客户、物品){
系统输出打印(“1.近战武器”);
系统输出打印(“2.远程武器”);
System.out.println(“3.Armors”);
扫描仪=新的扫描仪(System.in);
int scan=scanner.nextInt();
开关(扫描){
案例1:
印刷品(meleeMap);
打破
案例2:
打印(范围地图);
打破
案例3:
印刷品(armorMap);
违约:
System.out.println(“错误输入”);
}
}

public void print(HashMap您的打印方法指定HashMap:

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

public void print(HashMapQuestions正在寻求调试帮助(“为什么这段代码不起作用?”)必须包括所需的行为、带有完整错误消息和/或stacktrace的特定问题,以及在问题本身中复制该问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅:。错误在问题中有描述,但我将尽力编辑该问题以使其正确很清楚。我在问题中没有看到来自stacktrace的完整错误消息,无论在何处,表达的开始都是非法的。您描述了一条错误消息,但您没有发布来自stacktrace的完整错误消息,这是您必须得到的。一条是您的解释,这基本上是有问题的,另一条是对您的解释不含糊的那些知道如何帮助你的人。为什么我不能在方法中使用HashMap,如果它在构造函数之前声明为Map呢?因为
Map
不是
HashMap
对,但是HashMap实现了Map接口,不是吗?要说得非常清楚-使用
Map
没有错,需要修复的是
print()
方法-它需要接受任何
Map
,而不仅仅是该接口的
HashMap
实现。如果你说某个东西必须是
HashMap
a
Map
不是
HashMap
public void print(Map<? extends Item,Integer> map)