2013-04-25 15 views
6

エラーが発生する "演算子%は引数の型に対して未定義ですInteger、Integer"なぜこれが起こっているのかよく分かりません。私は、モジュラ分割が整数値を持つ小数点を返すことができないので、大丈夫だと思いました。2つの整数のMOD除算

これは、私が作成しているプログラムのメソッド内で起こっています。 次のようにコードがある:

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; 

任意のヘルプや提案で起こります。

+1

どのJavaのバージョンを使用していますか? – durron597

+0

Suspect @ durron597は正しいですが、あなたは<1.5を使用していますので、以下の答えに従ってください。 – earcam

+0

Java 1.5と1.6では、Integer%Integerを取得して正常にコンパイルできます。 – rgettman

答えて

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 introduced autoboxing and autounboxing in 1.5ので、あなたは1.5、たとえば、1.4以前からJavaコンパイラを使用しなければならないということです。

ソリューション:Javaの1.5/1.6/1.7へ

  • アップグレード。
  • 1.4を使用する必要がある場合はInteger.intValue()を使用してint の値を抽出し、%演算子を使用できます。
+0

非常に高く評価された@rgettman – user2268305

0

整数をintに変換してから、%を実行してみてください。

if(table[key.intValue() % tableSize.intValue()] == null) 
     table[key.intValue() % tableSize.intValue()] = node; 
2

これは問題なく機能します。

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

int z = x % y; 

System.out.println(z); 

問題はありません。出力:

1 

どのようなエラーが表示されますか?どのJavaのバージョンを使用していますか? 1.5より下のJavaを使用しているようです。

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の環境を、使用しているということです。

この場合の最善の策はおそらく明示的であり、を使用して、基礎となるintを取得します。

あなたもint(ないInteger)を使用して検討する必要がありますが、キーのためだけ(あなたがEntryに追加するとき)に、あなた必要時点でそれをボクシング。プリミティブ型を使うほうが速いかもしれませんが、確かにそれをベンチマークする必要があります。