2016-02-24 5 views
22

TreeMapを使用すると問題が発生しました。整数からintに変換する必要がある理由

Map<Integer, Integer> a = new TreeMap<Integer, Integer>(); 
    a.put(5,1); 
    a.put(3,2); 
    a.put(4,3); 
    int target = 7; 
    System.out.println(target - a.get(5)); //line 6 
    for(Map.Entry b : a.entrySet()){ 
     System.out.println(target - b.getValue()); //line 8 
    } 

上記のコードはコンパイルエラーです。しかし、私が8行目をこれに変更した場合:

Map<Integer, Integer> a = new TreeMap<Integer, Integer>(); 
    a.put(5,1); 
    a.put(3,2); 
    a.put(4,3); 
    int target = 7; 
    System.out.println(target - a.get(5)); //line 6 
    for(Map.Entry b : a.entrySet()){ 
     System.out.println(target - (int) b.getValue()); //line 8 
    } 

それが動作します。誰かが私にライン6の変更を必要としない理由を教えてもらえますか?ライン8の整数に変換する必要がありますか?

答えて

43

forステートメントの "raw type"警告が無視されました。それは次のようになります。生のタイプはObjectを返すようにgetValue()を引き起こす

for(Map.Entry<Integer,Integer> b : a.entrySet()) { 
     ... 

。型パラメータを指定すると、コンパイラはIntegerを返し、自動的にunboxedになります。

+0

Oh !!!どうもありがとう! – youngyjd

+1

a.entrySet()がすでに型を定義しているので、型を定義する必要がありますか、またはダイヤモンド演算子(Map.Entry <>)がJava 7で導入されていますか?もちろんOPのように何も使用しないと、エラーが発生します。 – Thomas

+2

@Thomas - タイプを定義する必要があります。ダイヤモンド演算子を使用するだけで、コンパイル時エラーが発生します。 –

5

(int) b.getValue()の下に複数の操作があります。最初にgetValue()Objectを返し、それがIntegerにキャストされ、intにアンボックスされます。 a.get()は<で整数を宣言しているのですぐにIntegerを返します(https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#get(java.lang.Object)でV型を返します)。

オペレータ-に対して定義されていないint - Objectオペレーションであるため、target - b.getValue()はコンパイルされませんでした。だからあなたは(int)にキャストしなければならないのです。

bがIntegerというオブジェクトを参照していても、それ以降は動作しません。

Integer a = 1; 
Object b = a; 
System.out.println(3 - b); // compile time error "bad operand types for binary operator '-'" 

続い作品

Integer a = 1; 
Object b = a; 
System.out.println(3 - a); 

はまた、ランタイムbがintに言及しないで

Integer a = 1; 
Object b = a; 
System.out.println(3 - (int) b); //this is when you say to compiler not to worry since you are sure that object reference refers to the object that is Integer. 

はしかしキャストが失敗した場合に動作します。たとえそれが最初にコンパイルされたとしても。

Integer a = 1; 
String s = "shouldn't work at runtime"; 
Object b = s; 
System.out.println(3 - (int) b); //this will compile but fail at runtime 
関連する問題