
List<?> 型で受け取ったデータを
List<A> 型か List<B> 型か判定して処理する必要があるのですが
何かお勧めの方法はあるでしょうか?
obj instanceof List<A>
とかくと、「ここでは List<?> を使えとコンパイラに怒られてしまいます。
List<?>では意味が無いので、現状は
List の要素を取り出して判定としていますが、結構手間ですし、
実は要素が無い時や null データでも処理を切り替えなくてはなりませんので、
現在は入れるデータが無くてもダミーデータを入れてもらってしのいでます。
もっとましな方法はないでしょうか?
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
> Java の Generics では型パラメータはコンパイル時までしか存在せず、
> 実行時には無くなっています。
いいえケースバイケースで残りますよ。
http://ideone.com/J5FFW
private List<E> list; -> E
private List<String> slist; -> String
No.1
- 回答日時:
Java の Generics では型パラメータはコンパイル時までしか存在せず、実行時には無くなっています。
したがって、型パラメータも含めた型チェックを実行時に行うことは出来ません。
obj instanceof List<?> も java.util.List で有るか否かを判定しているだけです。
詳しくは下記のページの「Erasureの意味合い」の章を見て下さい。
http://www.ibm.com/developerworks/jp/java/librar …
対策としては、配列を使うか、要素クラスの java.lang.Class<T> オブジェクトも併せて受取るようにするくらいしか無いかと思います。
配列は実行時にも要素型を判定でき、また、共変でも有るので、 Object[] を受取るようにすればどんなクラスの配列でも受取れ、要素型の判断も出来ます。
例) ----------------------------------------------
public static void main(String[] args) {
final List<String> list = new ArrayList<String>();
checkType(list);
checkType(list.toArray(new String[list.size()])); // true
checkType(list.toArray()); // false
checkType(list, String.class); // true
}
private static void checkType(List<?> list) {
System.out.println(list instanceof List<String>);// コンパイルエラー
}
private static void checkType(Object[] array) {
System.out.println(array instanceof String[]);
}
private static void checkType(List<?> list, Class<?> clazz) {
System.out.println(String.class.isAssignableFrom(clazz));
}
--------------------------------------------------
なるほど。他の言語では簡単だったので、
Javaでも可能と思っていたのですが、
Javaではコレクションの中身がないと
本質的に実行時の型判定は不可能ということなんですね。
これを元に対策を考えてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python 3.10で 同じlistに同じ構文で同じデータ代入した結果が異なる現象発生 7 2022/06/18 11:08
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
多次元配列は配列の配列である
-
Vectorに入ってるデータをJTabl...
-
ファイルから多次元配列への読...
-
Javaで文字を漢字であるか否か...
-
javaでの文字列からの数字抽出
-
Javaで文字と数字が混ざったも...
-
[Ljava.lang.Stringってなんですか
-
配列で、値の入っている要素数...
-
フローチャート
-
ファイルの読み込み、配列に格納
-
JListに一覧にして表示
-
セッションを使ったint型の値の...
-
この警告はどうすれば?
-
配列を使ってカレンダーを表示...
-
JSPでデータ一覧表示
-
ArrayList で配列を扱う場合の...
-
ArrayListからBean配列に値をセ...
-
JAVAで配列の要素に、負の値が...
-
ファイルからデータをうまく読...
-
javaで大容量テキストファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
この警告はどうすれば?
-
[Ljava.lang.Stringってなんですか
-
配列で、値の入っている要素数...
-
Javaで文字と数字が混ざったも...
-
同じ配列またはクラスを、2回...
-
C#で動的配列Listの中身をListB...
-
【Ajax通信&Java】配列の受け取...
-
javamailで複数人にメールを送...
-
【C#】ハッシュテーブル(連想...
-
java StringとString[]の違い
-
jspでの二次元配列
-
配列の中に複数存在する数がい...
-
cloneメソッドについて (java)
-
セッションを使ったint型の値の...
-
C言語でunsigned char配列を連...
-
javaでEUC-JP文字列→UTF-8への変換
-
csvファイルを2次元配列に格納
-
Generics で型チェック
-
MAPの配列・・・???!!!
-
2次元配列でのiとjについて。
おすすめ情報