Java Hashmap错误:不兼容的类型

Java Hashmap错误:不兼容的类型,java,hashmap,bluej,Java,Hashmap,Bluej,我制作了一个hashmap,它将罗马数字存储为键,将十进制数字存储为值。错误为“不兼容的类型-找到java.lang.Object,但需要int”。当我写“conversions.get(numOne.charAt(x));”时,我只是想得到罗马数字的值,我在这里做错了什么 import java.util.Scanner; import java.util.HashMap; public class test { static Scanner

我制作了一个hashmap,它将罗马数字存储为键,将十进制数字存储为值。错误为“不兼容的类型-找到java.lang.Object,但需要int”。当我写“conversions.get(numOne.charAt(x));”时,我只是想得到罗马数字的值,我在这里做错了什么

    import java.util.Scanner;
    import java.util.HashMap;

    public class test
    {
        static Scanner sc = new Scanner(System.in);
        static HashMap conversions = new HashMap();
        public static void main(String args[]){
            conversions.put('I',1);
            conversions.put('V',5);
            conversions.put('X',10);
            conversions.put('L',50);
            conversions.put('C',100);
            conversions.put('D',500);
            conversions.put('M',1000);

            String numOne = "XIX";

            for(int x = 0; x <= numOne.length()-2; x++){
                int temp1 = conversions.get(numOne.charAt(x));
                int temp2 = conversions.get(numOne.charAt(x+1));
            }
        }
    }
import java.util.Scanner;
导入java.util.HashMap;
公开课考试
{
静态扫描仪sc=新扫描仪(System.in);
静态HashMap转换=新建HashMap();
公共静态void main(字符串参数[]){
转换。put('I',1);
转换。投入('V',5);
换算。put('X',10);
换算。单位为('L',50);
换算。put('C',100);
换算。单位为('D',500);
换算。单位为('M',1000);
字符串numOne=“XIX”;

对于(int x=0;xHashMap存储并返回对象,并且不能直接将对象分配给Primitive:

 int temp1 = conversions.get(numOne.charAt(x));
 int temp2 = conversions.get(numOne.charAt(x+1));
请尝试以下方法:

int temp1 = (Integer) conversions.get(numOne.charAt(x));
int temp2 = (Integer) conversions.get(numOne.charAt(x+1));
或者更好地使用参数化贴图以避免在检索对象时强制转换:

static HashMap<Character, Integer> conversions = new HashMap<Character, Integer>();
static HashMap conversions=new HashMap();
更改行:

static HashMap conversions = new HashMap();

静态映射转换=newhashmap();
或者从Java7开始,我们可以通过执行以下操作来避免一些重复

static Map<Character,Integer> conversions = new HashMap<>();
static Map<String, Integer> conversions = new HashMap<String, Integer>();
静态映射转换=newhashmap();

总之,这将自动装箱您的原语并解决您的问题

正确使用泛型,您可以告诉Java您的
HashMap
应该包含什么:

static HashMap<Character,Integer> conversions = new HashMap<>();
static HashMap conversions=new HashMap();
这将使您的代码得以编译,因为编译器知道
conversions.get()
返回一个
Integer
(可以通过自动取消装箱自动转换为
int


在Java 7之前,您还需要重复初始化的类型,使其成为
new HashMap()

您需要将值强制转换为对象

for(int x = 0; x <= numOne.length()-2; x++){
    int temp1 = (Integer) conversions.get(numOne.charAt(x));
    int temp2 = (Integer) conversions.get(numOne.charAt(x+1));
}

for(int x=0;x
for(int x=0;x不要使用原始类型
HashMap
。Make是一种参数化类型。您应该发布完整的错误消息,而不仅仅是片段。@chrylis这是完整的错误消息它还指定了错误的位置,无论是编译时还是运行时。请注意,编译器将能够取消正确参数化的
Map
变量。虽然这可以解决问题,但这是旧的(预泛型)方式。他真的应该使用适当类型的
HashMap
而不是原始类型。@chrylis是的,但对于原始类型,它不会。这不是最好的解决方案,但仍然有效。为什么人们会否决一个可行的解决方案?@Lokesh:因为它不是最好的解决方案。如果没有充分的理由,可以先教初学者次优方法只会让开发人员认为这是最好的方法。谢谢,我一直在努力,所以我知道我做了什么wrong@TheEyesHaveIt:不幸的是,Java泛型只处理引用类型,
char
int
都是基元类型,所以您不能在这里使用它们。幸运的是,自动装箱和自动取消装箱会对您隐藏其中的大部分。谢谢:)我现在在回答中也加入了Java 7语法。
static Map<String, Integer> conversions = new HashMap<String, Integer>();
for(int x = 0; x <= numOne.length()-2; x++){
                int temp1 = (Integer) conversions.get(numOne.charAt(x));
                int temp2 = (Integer) conversions.get(numOne.charAt(x+1));
                System.out.println(temp1 + "   "+temp2);