我有一个关于使用通配符的问题。我在交换机的“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());
}
}
答案 0 :(得分:3)
您的print方法指定HashMap:
public void print(HashMap<? extends Item,Integer> map)
如果您传递地图引用,则可能意味着使用Map:
public void print(Map<? extends Item,Integer> map)