私は/負荷のArrayListを保存するためにシリアライズ/デシリアライズを使用する小さなJavaアプリケーションを書いています。私は、ファイルパスを取り、それ内のオブジェクトを逆シリアル化する次の関数を書いていました:
private Object deserialize(String fileName)
throws IOException, ClassNotFoundException {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName))) {
return ois.readObject();
}
}
この関数はObject型を返すので、私は、このようなArrayListにそれをキャストする必要があります:
ArrayList<String> arrayList = (ArrayList<String>)deserialize("test.file");
(上記の行は、try / catchステートメントで囲まれなければならないだろうが、私は読みやすさのためにここに含まれていませんでした)
このプロセスは、しかし、私が試してみて、私はオブジェクトを自分自身をキャストする必要はないだろうどこがポイントにコードを編集することができれば見てみたかった、と私ので、かなり冗談めかして、入力された、私のために罰金を働いた任意の戻り値の型などを私の機能、およびコンパイラが文句を言いませんでした。私は、次のように私の機能を変更し、私の驚きに、それは、実際に働きました!
private <Any> Any deserialize(String fileName)
throws IOException, ClassNotFoundException {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName))) {
return (Any)ois.readObject();
}
}
この機能を使用する場合、私は、もはや必要がArrayListにそれの戻り値をキャストすると、代わりに簡単に使用することができます。
ArrayList<String> arrayList = deserialize("test.file");
私の一部は、この全体のことでちょうどロールに望んでいるし、それがどのように機能するかを問うことなく、関数を使用するが、私はこれをやって困っています知っています。
誰かがこの関数はそれがないように動作する理由を説明、あるいは単に説明言い換えてもらえどれでも私は正直に前にそれを見たことがないよう、キーワードを。
Any
Javaではキーワードではありません。ここで注目すべき重要なことは、ある<Any>
アクセス修飾子の後に。メソッドが呼び出さtypeパラメータで一般化された-これは、メソッドの一般的な仕様ですAny
(あなたは、メソッド本体に鋳造するために使用)、そしてあなたがメソッドを呼び出すときに、Javaがします戻り値の型を推論します。
しかし、単語「任意」について何も特別ながあります。あなたは同じ効果に「T」または「SomeType」あるいは「スポンジボブ」を使用している可能性があります。