何人かの人から、Java では共変配列のサブタイプが許可されている、つまり、A が B のサブタイプである場合、A[] は B[] のサブタイプであるが、これはランタイムにつながる可能性があるため、悪い機能であると言われました。エラー。実行時エラーがどのように発生するか、Java がこの問題にどのように対処するかを説明する具体的な例を教えてもらえますか?
1 に答える
6
とてもシンプルです。
String strings[] = {"Broken","Type", "system"};
Object objects[] = strings;
objects[0] = 5; // compiles fine, but throws ArrayStoreException at runtime
共変型は、何かを取り出す限りは悪くありませんが、何かを入れた瞬間にすべてが壊れます。Object[] をパラメーターとして受け取るメソッドがあるとします。
fn(Object[]a){
...
}
で呼び出すことができればいいとString[]
思いませんか?
String[] s = {"I","didn't","know","that","this","was","broken"}
fn(s);
それができるのは当然のことのように思えます。言語にジェネリックがなかった初期の頃は特にそうでした。そして、何も変更されない限り、これはすべて正常に機能し、Java はそれを保証するメカニズムを提供しません。
不変である which を使用するため、常に を優先する必要がLists
あります。arrays
Lists
generics
于 2015-02-17T20:53:28.533 に答える