Hashmap 错误:不兼容的类型

Posted

技术标签:

【中文标题】Hashmap 错误:不兼容的类型【英文标题】:Hashmap error: incompatible types 【发布时间】:2013-10-14 08:32:30 【问题描述】:

我制作了一个哈希图,将罗马数字存储为键,将十进制数字存储为值。错误显示“不兼容的类型 - 找到 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));
            
        
    

【问题讨论】:

不要使用原始类型HashMap。 Make 是一个参数化类型。 你应该发布整个错误信息,而不仅仅是 sn-ps。 @chrylis 这是整个错误消息 它还指定了错误的位置,无论是编译时还是运行时。 【参考方案1】:

换行:

static HashMap conversions = new HashMap();

static Map<Character,Integer> conversions = new HashMap<Character,Integer>();

或者从 Java 7 开始,我们可以通过执行以下操作来避免一些重复

static Map<Character,Integer> conversions = new HashMap<>();

总而言之,这将自动装箱您的图元并解决您的问题

【讨论】:

谢谢,我正在尝试做 ,所以我明白我做错了什么 @TheEyesHaveIt:不幸的是,Java 泛型只处理引用类型,charint 都是原始类型,所以你不能在这里使用它们。幸运的是,自动装箱和自动拆箱对您隐藏了大部分内容。 谢谢 :) 现在我的答案中也包含了 Java 7 语法。【参考方案2】:

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

static HashMap<Character,Integer> conversions = new HashMap<>();

这将使您的代码编译,因为编译器会知道conversions.get() 返回一个Integer(并且可以通过自动拆箱自动转换为int)。

在 Java 7 之前,您还需要重复初始化类型,使其成为 new HashMap&lt;Character,Integer&gt;()

【讨论】:

【参考方案3】:

您需要将值转换为对象。正如其他人已经建议使用的那样

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));

我也建议像下面这样声明 Hashmap

static Map<String, Integer> conversions = new HashMap<String, Integer>();

【讨论】:

【参考方案4】:

HashMap 存储和返回对象,您不能直接将对象分配给图元:

 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));

或更好地使用参数化 Map 以避免在检索对象期间进行强制转换:

static HashMap<Character, Integer> conversions = new HashMap<Character, Integer>();

【讨论】:

请注意,编译器将能够拆箱正确参数化的Map 变量。 虽然这解决问题,但这是旧的(前泛型)方式。他真的应该使用正确类型的 HashMap 而不是原始类型。 @chrylis 是的,但对于原始地图它不会。 它不是最好的解决方案,但它仍然可以工作。人们为什么会对可行的解决方案投反对票? @Lokesh:因为它不是最好的解决方案。在没有充分理由的情况下首先教初学者次优方法只会导致开发人员认为这是最好的方法。【参考方案5】:
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);

使用这个,输出是 -

10 1 1 10

【讨论】:

以上是关于Hashmap 错误:不兼容的类型的主要内容,如果未能解决你的问题,请参考以下文章

如何修复不兼容的块指针类型发送错误?

FusedLocationApi.requestLocationUpdates 给出不兼容的类型错误

联合分配的不兼容类型错误

类型的参数与类型错误的参数不兼容[重复]

为啥 heroku 会给我这个“不兼容的类型”错误?

BlueJ 错误:“不兼容的类型:int 无法转换为 java.lang.String”和“不兼容的类型:java.lang.String 无法转换为 int”