[解決済み] ArrayStoreExceptionへの対応
質問
Object[] o = "a;b;c".split(";");
o[0] = 42;
スロー
java.lang.ArrayStoreException: java.lang.Integer
の間に
String[] s = "a;b;c".split(";");
Object[] o = new Object[s.length];
for (int i = 0; i < s.length; i++) {
o[i] = s[i];
}
o[0] = 42;
はしない。
その例外に対処するために、一時的な
String[]
の配列は?
どのように解決するのですか?
Javaでは、配列は オブジェクト .
のオブジェクトを置くことができます。
サブタイプ
の変数に入れることができます。
スーパータイプ
. 例えば
String
オブジェクトを
Object
という変数があります。
残念ながら、Javaでの配列の定義は、何らかの形で壊れています。
String[]
のサブタイプとみなされます。
Object[]
が、それは
いけない
! より詳しい説明は、quot;共分散と共分散" を読んでいただきたいのですが、要するに、こういうことです。ある型が他の型のサブ型とみなされるのは、そのサブ型が以下の条件を満たす場合だけです。
すべての義務
のスーパータイプです。つまり、スーパータイプオブジェクトの代わりにサブタイプオブジェクトを取得した場合、スーパータイプの契約に矛盾する動作を期待してはいけないということです。
問題は
String[]
をサポートするだけです。
部分
の
Object[]
を契約することができます。例えば、次のようなことができます。
読む
Object
からの値
Object[]
. また
読む
Object
の値(これはたまたま
String
オブジェクト)から
String[]
. ここまでは良いのですが 問題はコントラクトの他の部分です。あなたは
任意の
Object
に
Object[]
. しかし
任意の
Object
に
String[]
. したがって
String[]
のサブタイプと見なすべきではない。
Object[]
しかし、Javaの仕様ではそうなっています。そのため、このような結果になってしまうのです。
(なお、ジェネリッククラスでも同様の事態が再び発生しましたが、今回は解決済みです
正しく
.
List<String>
は
ではない
のサブタイプである
List<Object>
;そして、これらに共通のスーパータイプが必要な場合は
List<?>
これは読み取り専用です。配列の場合もそうであるべきですが、そうではありません。そして、後方互換性のために、それを変更するには遅すぎるのです)。
最初の例では
String.split
関数は
String[]
オブジェクトを作成します。これを
Object[]
変数に格納されますが、オブジェクトは
String[]
. このため
Integer
の値を指定します。を新たに作成する必要があります。
Objects[]
の配列を作成し、その値をコピーします。を使うことができます。
System.arraycopy
関数を使用してデータをコピーすることもできますが、新しい配列を作成することを避けることはできません。
関連
-
[解決済み】Javaで無限大を実装する方法とは?
-
[解決済み】 JAVA 変数宣言はここではできない
-
[解決済み】文字列中の � を置換する方法
-
[解決済み] 1...N を含む配列の作成方法
-
[解決済み] Javaで数値を小数点以下n桁に丸める方法
-
[解決済み] 新しい配列を作成せずに、既存のJavaScript配列を別の配列で拡張する方法
-
[解決済み] JavaScriptで配列の長さを初期化する方法は?
-
[解決済み] SetをArrayに変換するには?
-
[解決済み] JavaScriptでオブジェクトの配列から明確な値を取得する方法は?
-
[解決済み] クエリ文字列の中で配列を渡すには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み】エラー。Selection does not contain a main type
-
[解決済み】Android Studioでタスク :app:compileDebugJavaWithJavac の実行に失敗しました。
-
[解決済み】宣言されたパッケージが期待されるパッケージと一致しない ""
-
[解決済み】Javaを包含するクラスではないのか?
-
[解決済み】Javaメソッドスタブ
-
[解決済み】Java LinkedListでNodesを使用する
-
[解決済み】Javaの未処理例外について
-
[解決済み】接続Java - MySQL : 公開鍵の取得は許可されていません。
-
[解決済み] List<Dog> は List<Animal> のサブクラスですか?Java のジェネリックはなぜ暗黙のうちに多相性にならないのですか?