2016-08-08 11 views
-3

以下の例では、<Integer,Integer>の新しく作成されたHashMapを参照する汎用の参照hmを作成しようとしました。しかし、たとえ私が文字列の値をhm参照を使って追加しても、それは許されています。例えば、refがある場合。 hm1は、コンパイル時にエラーをスローしています。 オブジェクト宣言での汎用宣言の使用方法(例:HashMap <Integer、Integer>)

HashMap hm = new HashMap<Integer,Integer>(); 
hm.put("hello", "HashMap"); // why it is allowing even if the object created passed <Integer,Integer> else what is significance of <Integer,Integer> on object declaration 

HashMap <Integer,Integer> hm1; 
hm1 = hm; 
hm1.put("adfasf", "adff"); // throws error 

は、だから私の質問は、なぜ要素作成されたオブジェクトが渡された場合でも、異なるデータ型を有するを追加できるようにされている他の <Integer,Integer>オブジェクトの宣言に <Integer,Integer>の意義は何ですか?

+2

あなたの質問には、テキストエリアの右側に大きいオレンジ色**の書式設定**ボックスがあり、そこに有益な情報があります。また、書式設定支援ツールバー全体がありました。 ** [?] **ボタンを押すと書式設定のヘルプが表示されます。 *また、テキストエリアと投稿の質問ボタンの間にあるプレビューエリア(ボタンを見つけるために過去にスクロールする必要があるため、あなたがそれを見てみることを推奨します) 。あなたの投稿をはっきりさせ、時間を割いていることを実証することで、良い答えを得る機会が増えます。 –

+1

生の型にキャストしているので、すべてのジェネリックが失われます。 – 4castle

+0

'HashMap hm;' - 参照型はありません。 –

答えて

2
HashMap hm = new HashMap<Integer,Integer>(); 
hm.put("hello", "HashMap"); 

Javaのジェネリックスはコンパイル時にのみ発生し、実行時にはまったく効果がありません。

これは、実行時にHashMap<String, String>HashMap<Integer, Integer>と同じ種類のオブジェクトであることを意味します。

すべてのジェネリックスは、宣言された型の健全性をチェックするようにコンパイラに指示します(歴史的な理由からこれはオプトインですが、ジェネリック体をオフにすることができます)。

例では、変数のタイプは生のタイプHashMap(総称タイプなし)です。そのため、コンパイラはキーまたは値の型チェックを実行しません。 (そしてあなたはそれについて警告を受けているでしょう)。 hmとは対照的に、

HashMap <Integer,Integer> hm1; 
hm1.put("adfasf", "adff"); // throws error 

、あなたのhm1は、ジェネリック型を持っている、とコンパイラがそれをチェックします。

ただし、実行時の問題ではありますが、コンパイルに失敗するだけで、「エラーが発生しません」ということに注意してください。このコードをコンパイルすると、エラーなしで実行されます(hmから同じオブジェクトにアクセスしたときに目撃したように)。型変換が実行時に失敗するため、Integerをマップから再度取得しようとしたときにのみエラーが発生します。

+0

ありがとうございます。しかし、 'new HashMap ()' – Harish

+0

でジェネリックを許可するのはどういう意味でしょうか?Map h1 = new HashMap ) '。コンパイラはこれを拒否します。あなたが書いたものも警告を生成します。 – Thilo

+1

左側にタイプがある場合、 'new HashMap ()'は少し冗長です。そのため、Javaでは代わりに 'new HashMap <>()'を書くことができます。それにはまだ「ダイヤモンド」があることに注意してください。それは生の型ではなく、推論されたジェネリック型です。 – Thilo

2
HashMap hm = new HashMap<Integer,Integer>(); 
hm.put("hello", "HashMap"); // why it is allowing even if the object created passed <Integer,Integer> else what is significance of <Integer,Integer> on object declaration 

hmHashMap、ないHashMap<Integer, Integer>を入力しているため。 HashMap<Integer, Integer>を割り当てましたが、タイプをHashMapと指定しただけです。 HashMapはkeyとvalueの両方のオブジェクトを受け入れますので、文字列は受け入れられ、コードはコンパイルされます。 (それはまたあるため型消去のため、実行されます。)

HashMap<Integer,Integer> hm1; 
hm1 = hm; 
hm1.put("adfasf", "adff"); // throws error 
あなたは hm1が含まれていますどのようなコンパイラを言ったので、コンパイルに失敗し

hm1のタイプはHashMap<Integer, Integer>で、HashMapだけでなく、コンパイラーは文字列を入れても問題ないことを知っています。