これらのページでクラスキャスト例外に関する他の多くの質問を読みましたが、私の問題が本質的に同じことであることを確認したいと思います(つまり、コンパイル時と比較して実行時にクラスのバインドされたタイプがわからないことに関連しています)。
これが私のテストクラスです。
public class testCastReturn{
public test(){
HashSet<String> StringHash; //a simple hash set
HashMap(<String, ComplexObject> ObjectInfo; //the String value is the name of the complexObject, and complexObject has multiple members (in this instance it is a java model for a database field so it has info pertaining to Key, size etc)
//create a ComplexObject here
addToObjectInfo(aComplexObject); // add it into the HashMap
//repeat above a number of times....
//now collect the 'names' of those objects
StringHash = getObjectKeys();
}
public void addToObjectInfo(complexObject c){
//put a complex object into the HashMap
ObjectInfo.put(c.getNameID, c); //create a set of key value pairs where the name of the object is the key to get the actual object
}
public HashSet<String> getObjectKeys(){
//retrieve the keys only
return HashSet<String> this.ObjectInfo.keySet(); //fails with classCastException
//this however works
HashSet<String> temp = new HashSet<String>(this.ObjectInfo.keySet());
return temp;
}
}//end class
私の理解が正しければ、これがコードをどちらの形式でもコンパイルできる理由ですが、実行時にJVMがバインドされたタイプを保証できないため、キーセットを保持するための一時的な場所を明示的に作成する場合にのみコードを実行できます。キーはComplexObjectにあります。これは不自然なバージョンであるため、単純化しすぎている可能性があることに注意してください。実際のコードでは、「ビルダー」を使用し、情報を「finalised」クラスに渡します。その後、これらのクラスの束が3分の1以内に保持されます。 ComplexObjectsのHashMapを持つオブジェクト。
さらに詳しい情報が必要な場合は、お問い合わせください(必要に応じて、ライブラリのコピーを送信することもできます)。
デビッド