1

次のコードを使用します。

Main.java

 // ...

 private static <T extends Serializable> T doStuff() {
     Response r = ...

     // ...

     return r.getDetails();//Error here
 }

 // ...

Response.java

 interface Response {
    // ...

    Serializable getDetails();

    // ...
 }

メソッドで「型の不一致: Serializable から T に変換できません」というコンパイル エラーが発生しますdoStuff

返された結果をキャストすると、エラーは削除されます。

  return (T)r.getDetails();

しかし今、私はこの警告を持っています: Type safety: Unchecked cast from Serializable to T. @SuppressWarnings("unchecked")警告を抑制しますが、この解決策は醜いと思います。

より良いオプションはありますか?

4

4 に答える 4

5

問題は、あなたのコードでは、すべてTが である必要がありますが、すべてが であるとはSerializable限らないことです。SerializableT

と の両方がであるT1と仮定すると、次の場合も問題が発生します。T2Serializable

T1 t = new T2();

asT1T2は関係ありませんが、両方ともSerializableです。

于 2013-06-12T12:20:04.767 に答える
1

実装の詳細が少なすぎる場合は、Response一般的なものにすることをお勧めします。

private static <T extends Serializable> T doStuff() {
    Response<T> r = ...;

// ...

    return r.getDetails();
}

interface Response<T extends Serializable> {
    // ...

    T getDetails();

    // ...
}

しかし、それはあなたが持っているかもしれない残りのものと必ずしもうまくいくわけではありません. 問題は、Thorsten Dittmar が既に書いたものです。

于 2013-06-12T12:21:52.970 に答える
1

返されたオブジェクトを次の ようなT型にキャストする必要があります。

return (T) r.getDetails();

アップデート

次に、ResponseインターフェイスまたはgetDetails()メソッドをジェネリックにする必要があります。
このような:

interface Response<T extends Serializable> {
// ...

T getDetails();

}

また

interface Response {
// ...

<T extends Serializable> T getDetails();

}
于 2013-06-12T12:13:02.513 に答える