「演算子%は引数タイプInteger、Integerに対して未定義です」というエラーが表示され続けます。なぜこれが発生するのかよくわかりません。モジュラー除算では小数を返すことができないので、整数値でも大丈夫だと思いました。
これは、私が作成しているプログラムのメソッド内で発生しています。コードは次のとおりです。
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;
どんな助けや提案もいただければ幸いです。
Java 1.5および1.6で正常にコンパイルできるサンプル_Integer % Integer
_コードを取得できましたが、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を使用する必要があるということです。
ソリューション:
Integer.intValue()
を使用してint
値を抽出します。この値で、_%
_演算子を使用できます。これは私にとってはうまくいきます。
Integer x = Integer.valueOf(10);
Integer y = Integer.valueOf(3);
int z = x % y;
System.out.println(z);
問題はありません。出力:
1
どのようなエラーが発生していますか?どのバージョンのJavaを使用していますか?1.5未満のJavaを使用しているようです。
ここで試みているのはボックス化解除と呼ばれ、オブジェクトをプリミティブ型に自動変換します(逆の方法は自動ボックス化です)。
Javaドキュメントには次のように書かれています:
Javaコンパイラは、ラッパークラスのオブジェクトが次の場合にボックス化解除を適用します。
したがって、1つの可能性は、notこれらのいずれかを実行していることです。一見すると、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";
}
}
_
もう1つの可能性は、自動ボックス化とボックス化解除が導入されたpre Java 5環境を使用していることです。
その場合の最善の策は、おそらく明示的であり、Integer.intValue()
を使用して基になるint
に到達することです。
ただし、キーにint
(Integer
ではなく)を使用し、必要から(追加するとき)のポイントでのみボックス化することを検討することもできます。 Entry
に変換します)。もちろん、確実にベンチマークする必要がありますが、プリミティブ型を使用する方が速い場合があります。
整数を整数に変換してから、%
を実行してください。
if(table[key.intValue() % tableSize.intValue()] == null)
table[key.intValue() % tableSize.intValue()] = node;