0

私のキャッシュクラスには、シリアル化されたバージョンのオブジェクト(未決定の型)をファイルに書き込む関数(ジェネリック関数)があります。

public <O> void write(O object) {

   // ...
   serialize(file, object);
   // ...

}

これはうまく機能しますが、メソッドが任意のオブジェクトを取得できるように、任意のオブジェクトを返すことができるメソッドを作成する方法を見つけることができませんwrite()。このようなものを探しています:

public <O> read() {

   // ...
   O object = unserialize(file);
   // ...

   return object;

}

これを達成する方法についての提案は大歓迎です!

4

6 に答える 6

7

Object型の戻り型を指定します。

public Object function(...)

そうすれば、戻り型は常にObject型になり(すべてのオブジェクトはの子孫であるObjectため)、受け入れられます。

于 2012-09-02T17:42:56.613 に答える
1

あなたが意味するなら

public <O> O read() {

これはほとんど同じなのでほとんど役に立たない

public Object read() {
于 2012-09-02T17:43:19.503 に答える
0

質問を正しく理解したかどうかはわかりません...両方のメソッドをクラス内でラップし、次のようにオブジェクトの型でクラスをパラメーター化できます。

public class ReaderWriter <T> {
    public ReaderWriter(File file) {...}
    public void write(T object) {...}
    public T read() {...}
}
于 2012-09-02T17:48:01.070 に答える
0

クラス全体をジェネリックにすることでそれを行います

class Cache <O extends Serializable> {

    public void write(O object) {
        serialize(file, object);
    }

    public O read() {
        O object = (O)unserialize(file);

        return object;
    }
}

返されたオブジェクトのキャストに注意してください。

<O extends Serializable>それに加えて、あなたはただの代わりに使うべきです<O>。これにより、型パラメーターIDがシリアライズ可能な型であることが保証されます。これは、オブジェクトを保存(シリアル化)して、後のエラーを防ぐ場合に必要です。

于 2012-09-02T17:49:09.750 に答える
0

はい、

public <O> O read()

は有効であり、必要な処理を実行します(呼び出し元が必要とするタイプを返します)。これが良い考えかどうかは別の問題です

于 2012-09-03T23:44:17.043 に答える
0

read() の呼び出し元は、取得する予定の型を知っていると想定しています。戻り値を何らかの変数に代入するため、これは妥当な仮定です。

MyType o = read(...); // Caller knows he's going to get a MyType object

この仮定が正しい場合read()は、クラス オブジェクトを受け取るようにメソッドを変更する必要があります。

public<T> T read(Class<T> t) {
   ... 
}

次に、呼び出しサイトは次のようになります。

MyType o = read(MyType.class);
于 2012-09-02T17:54:47.330 に答える