1

これらのページでクラスキャスト例外に関する他の多くの質問を読みましたが、私の問題が本質的に同じことであることを確認したいと思います(つまり、コンパイル時と比較して実行時にクラスのバインドされたタイプがわからないことに関連しています)。

これが私のテストクラスです。

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を持つオブジェクト。

さらに詳しい情報が必要な場合は、お問い合わせください(必要に応じて、ライブラリのコピーを送信することもできます)。

デビッド

4

2 に答える 2

4

keySet()Setではなく、を返しますHashSet。そうreturn this.ObjectInfo.keySet();すべきです。

経験則:コレクション(および一般的なオブジェクト)は、クラスではなく、常にインターフェイスで参照します。だから、ListとにとSetを好む。具象型は、オブジェクトをインスタンス化する場合、または具象実装に固有の機能が必要な場合にのみ使用してください。ArrayListHashSet

于 2012-05-23T12:43:33.527 に答える
1
public Set<String> getObjectKeys(){
   return this.ObjectInfo.keySet();
}

これはあなたのために働きますか?

于 2012-05-23T12:46:41.023 に答える