0

バイナリ ファイルからオブジェクトを読み取るメソッドを作成したいのですが、ジェネリックを使用して一般化したいと考えています。

私はこのコードを持っています:

@SuppressWarnings ("unchecked")
public static <T> T readFromBinaryFile (String filename){
T obj = null;

if (FileUtils.existsFile (filename)){
    ObjectInputStream ois = null;
    try{
        ois = new ObjectInputStream (new FileInputStream (filename));
        obj = (T)ois.readObject ();
    }catch (IOException e){
        Debug.out (e);
    }catch (ClassNotFoundException e){
        Debug.out (e);
    }finally{
        try{
            if (ois != null) ois.close();
        }catch (IOException e){
            Debug.out (e);
        }
    }
}

return obj;

}

実行すると、ClassCastException が発生します。私はJavaのテンプレートについて何も知らないので、どんな情報でも評価されます。消去、コンパイル時間、実行時間に関連するものを読みましたが、この ClassCastException が発生する理由がよくわかりません。

ありがとう。

編集:私はこのようにメソッドを呼び出します:( FileUtils.readFromBinaryFile (filename);なし "")

4

3 に答える 3

2

ClassCastExceptionは、読み取ったタイプが期待した(およびキャストした)タイプと一致しなかったことを意味します。デバッガー(またはログメッセージ)で読み取ったオブジェクトを確認し、期待したものと比較することをお勧めします。

于 2011-01-07T23:00:59.753 に答える
2

Java にテンプレートはありますか? T の代わりに Object を使用するだけです。Java では、すべてがベースの Object から派生するため、T obj ではなく Object obj が必要です。

于 2011-01-07T22:57:47.900 に答える
1

メソッドの呼び出し方が間違っています。このようにしてください:

FileUtils.readFromBinaryFile (filename); 

あなたが呼んでいるのは、いわゆるジェネリックメソッドです。

「実際の型引数をジェネリック メソッドに渡す必要はありません。コンパイラは、実際の引数の型に基づいて、型引数を推論します。通常、呼び出しの型を作成する最も具体的な型引数を推論します。 -正しい。" ソース

編集:

私はあなたの例を試してみましたが、うまくいきます(実際にいくつかの行にコメントを付けました)

    private static String filename = "number.serialized";

    public static void main(String[] args) {
        Double d = 3.14;
        writeToBinary(d, filename);
        Double readD = readFromBinaryFile(filename);
        System.out.println(readD);
    }

    @SuppressWarnings ("unchecked")
    public static <T> T readFromBinaryFile(String filename) {
        T obj = null;
        File file = new File(filename);
        if (file.exists()) {
            ObjectInputStream ois = null;
            try {
                ois = new ObjectInputStream(new FileInputStream(filename));
                obj = (T)ois.readObject();
            } catch (IOException e) {
            } catch (ClassNotFoundException e) {
            } finally {
                try {
                    if (ois != null)
                        ois.close();
                } catch (IOException e) {
                }
            }
        }
        return obj;
    }

    public static <T> void writeToBinary(T obj, String filename) 
    {
        try {
            FileOutputStream fis = new FileOutputStream(filename);
            ObjectOutputStream oos = new ObjectOutputStream(fis);
            oos.writeObject(obj);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
于 2011-01-08T02:03:00.410 に答える