0

私が持っているとしましょう

public interface General extends Serializable {
   ...
}

public class Specific implements General {
   ...
}

型のオブジェクトを をArrayList<Specific>介して送信しObjectOutputStream、 にキャストして逆シリアル化できList<General>ますか? それはうまくいきますか?そうでない場合は、どうすればよいですか?

4

3 に答える 3

0

ArrayList は、javadocs ごとにシリアライズ可能です (コレクション クラスの多くは、含まれているオブジェクトがそうである限り)、ジェネリック型がシリアライズ可能である限り、シリアライゼーション側が機能します。 ArrayList

微妙なキャストです。一般的に、それは安全ではないと考えられます。あなたが持っていたら

 List<Specific> 

あなたはそれをキャストすることはできません

 List<Generic>

それらは論理的には同じではありません (実際には実行時に同じであったとしても)。実際、プログラムでのそのような直接キャストは問題があります。これは有効だからです。

List<Specific> specific = ...;
List<Generic> generic = (List<Generic>) specific;

generic.add(new OtherImplExtendingGeneric());
specific.get(specific.length() -1).methodOnlyOnSpecific(); // Kersplode

しかし、あなたはそれをオブジェクトとして扱っており、他のタイプへの他の参照がないため、うまくいきます。それはあなたがそれをするのを妨げません。それは技術的に望ましい結果を生み出します。それには理由があるかもしれませんが、コード レビューで眉をひそめることは間違いありません。

ジェネリック型をキャストする必要があるのはなぜですか?

于 2013-09-07T19:39:18.507 に答える