2017-05-11 9 views
-1
public class Model extends LinkedHashMap<String, Object>{ 

} 

LinkedHashMap<String, Object> map = //instance of LinkedHashMap 

Model model = (Model) map // Exception. 

LinkedHashMap<String,Object>をキャストしようとすると、クラスキャスト例外が発生します。マップをJavaクラスにキャストできません

私は基本的に私はModelinstanceof LinkedHashMapではありませんので、あなたはそれを行うことはできませんModelクラス

+3

'//いくつかの[値]とは何ですか?それは 'new Model()'か '新しいLinkedHashMap()'ですか? – Jens

+4

'LinkedHashMap' *が' Model'になることができるからといって、必ずしもそうであるとは限りません。代わりにあなたの 'Model'クラスをインスタンスすることができた時、あなたはダウンキャスティングによって何を得ますか? –

+1

もちろん新しいLinkedHashMap()です – Pau

答えて

1

LinkedHashMapは、Modelが期待されるため使用できません。したがって、キャストできません。

おそらくModelにはLinkedHashMapよりも多くのメソッドと機能があります。 Modelクラスに新しいものをまだ追加していない場合でも、Javaはそれを想定しています。

考えられる解決策:変更

LinkedHashMap<String, Object> map = //instance of LinkedHashMap 

LinkedHashMap<String, Object> map = //instance of Model 

に対する別の解決策:代わりに Mapを使用するように Modelクラスを使用するコードを変更します。

さらに別のアプローチ:MapからModelを派生させないでください。ModelMapです。それに応じてコードを変更します。

一般に、オブジェクト指向プログラミング、特に集約に有利な継承を非難する近代的なソートについて学ぶ必要があります。 ClassCastExceptionがため

2

に私のマップをキャストしてる理由だ引数としてモデルを期待するユーザー定義の方法を使用しています。メモリ割り当ての点で考えてみましょう。あなたは実際に何をしましたか? LinkedHashMapには十分なメモリが割り当てられていますが、Modelには割り当てられていません。コンパイラはあなたをあなた自身から救おうとしています。

+0

'Model'は型です。それは決して何の事例でもありません。ここでのメモリ割り当ては問題ではなく、型の関係です。この回答は完全に欠けていました。つまり、ダウンキャスティングです。つまり、JLSが指摘しているように、常に(!)参照の変換を絞り込むとClassCastExceptionが発生する可能性があります。 http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.6 –

0

APIの仕様は言う:

コードが、それはインスタンスではありませんそのサブクラスにオブジェクトをキャストしようとしたことを示すためにスローされます。

class P { 
} 
class C extends P { 
} 

P p = new P(); 
C c = (C) p;//java.lang.ClassCastException; Runtime Exception 

本当にやりたい場合。あなたはこの方法でそれを実行します。

LinkedHashMap map = new Model(); 
     map.put("one", "1"); 

     Model model = (Model) map; // Exception. 
     System.out.println(model); 

referece:Explanation of "ClassCastException" in Java

関連する問題