6

我不断收到错误消息“未定义参数类型整数、整数的运算符 %”我不太确定为什么会这样。我认为由于模除法不能返回小数,因此具有整数值就可以了。

这发生在我正在创建的程序的方法中。代码如下:

    public void addToTable(Integer key, String value)
{
    Entry<Integer, String> node = new Entry<Integer, String>(key, value);
    if(table[key % tableSize] == null)
        table[key % tableSize] = node;
}

该方法未完成,但错误发生在

    if(table[key % tableSize] == null)

    table[key % tableSize] = node;

任何帮助或建议将不胜感激。

4

4 回答 4

7

我可以获得一些示例Integer % Integer代码,以便在 Java 1.5 和 1.6 中成功编译,但在 1.4 中则不行。

public static void main(String[] args)
{
   Integer x = 10;
   Integer y = 3;
   System.out.println(x % y);
}

这是1.4中的错误:

ModTest.java:7: operator % cannot be applied to java.lang.Integer,java.lang.Integer
       System.out.println(x % y);
                            ^

最合理的解释是因为Java 在 1.5 中引入了自动装箱和自动拆箱,所以你必须使用 1.5 之前的 Java 编译器,比如 1.4。

解决方案:

  • 升级到 Java 1.5/1.6/1.7。
  • 如果您必须使用 1.4,请使用Integer.intValue()提取int 值,您可以在其上使用%运算符。
于 2013-04-25T22:50:21.690 回答
2

这对我来说很好。

Integer x = Integer.valueOf(10);
Integer y = Integer.valueOf(3);

int z = x % y;

System.out.println(z);

没问题。输出:

1

你遇到了什么错误?您使用的是什么版本的 Java?看来您正在使用低于 1.5 的 Java。

于 2013-04-25T22:42:39.910 回答
1

您在这里尝试的称为取消装箱,即将对象自动转换为原始类型(另一种方式是自动装箱)。

Java 文档有这样的说法:


Java 编译器在包装类的对象是以下情况时应用拆箱:

  • 作为参数传递给需要相应原始类型的值的方法。
  • 分配给相应原始类型的变量。

所以一种可能性是你没有做这些事情,虽然乍一看你既没有将你的 mod 表达式传递给一个方法也没有将它分配给一个变量,但它是有效的,至少在 Java 6 中:

class Test {
    public static void main(String args[]) {
        Integer x = 17;
        Integer y = 5;
        System.out.println (x % y);
        String [] z = new String[10];
        z[x % y] = "hello";
    }
}

另一种可能性是您使用的是 Java 5 之前的环境,其中引入了自动装箱和拆箱。

在这种情况下,最好的选择可能是明确的并用于Integer.intValue()获取底层int.

但是,您可能还需要考虑使用int(not Integer) 作为密钥,并且仅在需要的位置将其装箱(当您将其添加到 时Entry)。使用原始类型可能会更快,尽管您当然应该对其进行基准测试以确定。

于 2013-04-25T22:56:16.043 回答
0

Try converting the Integers to ints, then run %.

if(table[key.intValue() % tableSize.intValue()] == null)
        table[key.intValue() % tableSize.intValue()] = node;
于 2013-04-25T22:39:09.003 回答