クラスIは、ObjectInputStream(in
)を使用してクラスVehicle
のオブジェクトを読み取るコードを記述するように割り当てられました。オブジェクトはorders
というArrayListに格納されます。未チェックキャストオブジェクトをArrayListにアドレス指定する方法<Vehicle>
SSCE:
// Read all orders
Object obj = in.readObject();
orders = (ArrayList<Vehicle>) obj;
はしかし、コンパイラは文句:
MacBook:Homework Brienna$ javac Orders.java -Xlint:unchecked
Orders.java:152: warning: [unchecked] unchecked cast
orders = (ArrayList<Vehicle>) in.readObject();
^
required: ArrayList<Vehicle>
found: Object
1 warning
私はいつも私のコードの代わりに、警告を無視したり抑制を改善しよう。この場合、私は解決策を思いつきましたが、なぜそれがうまくいくのか、さらに良い解決策があるのか理解しようとしています。
このアップデートは、警告を停止します。私は読んでてきたものではありませんすべての要素がVehicle
をしている場合(ArrayList<Vehicle>) obj
が例外をスローする可能性があるため、それが動作から私が理解に基づいて
// Read all orders, casting each order individually
Object obj = in.readObject();
ArrayList ar = (ArrayList) obj;
for (Object x : ar) {
orders.add((Vehicle) x);
}
。私は混乱しています - その型パラメータがVehicle
として指定されていても、非VehicleオブジェクトはArrayListに追加できますか?また、よりよい解決策がありますか? instanceof
を使用していますか?
...どうしてですか?なぜあなたは 'readObject'の結果から型を知らないのですか?なぜ生の型を使用していますか? (これは、生の型を扱うときのあなたの世界のようなものですが、実際にはコンパイラの警告を振ることはできません) – Makoto
私は代入のためにこれをやっています。 'readObject'の予想される型は' ArrayList 'ですが、コンパイラの警告がスローされます。私が上で与えた解決策は機能します。そしてなぜそれがうまくいくのか教授の説明がわかりませんでしたので、私はより明確な説明を見つけることを望んでいます。 –
briennakh
ハングします。したがって、メソッドのシグネチャは 'public ArrayList readObject()'ですか?なぜ、その結果を 'Object'に保存しようとしていますか? –
Makoto