
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ページング
-
ArrayListからBean配列に値をセ...
-
Javaで文字と数字が混ざったも...
-
[Ljava.lang.Stringってなんですか
-
jspでの二次元配列
-
この警告はどうすれば?
-
2次元配列のコピー
-
配列で、値の入っている要素数...
-
ランダムでのboolean値の与え方
-
配列に添え字を書かないと・・・
-
【Ajax通信&Java】配列の受け取...
-
java StringとString[]の違い
-
javaでの文字列からの数字抽出
-
hit&blow
-
セッションを使ったint型の値の...
-
配列をセッションに割り当てた後で
-
C言語でunsigned char配列を連...
-
CSVファイルの、列だけ取得したい
-
オブジェクトの中のプロパティ...
-
ORA-01858: 数値を指定する箇所...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[Ljava.lang.Stringってなんですか
-
Javaで文字と数字が混ざったも...
-
配列について
-
C#で動的配列Listの中身をListB...
-
ArrayListからBean配列に値をセ...
-
この警告はどうすれば?
-
配列で、値の入っている要素数...
-
配列をセッションに割り当てた後で
-
同じ配列またはクラスを、2回...
-
配列の中に複数存在する数がい...
-
ページング
-
JavaBeansの配列の値取得方法に...
-
配列数を超えてアクセスしたと...
-
n番目に大きな値を探索する
-
C言語でunsigned char配列を連...
-
java
-
セッションを使ったint型の値の...
-
【C#】ハッシュテーブル(連想...
-
for文とStringBuffer
-
【Ajax通信&Java】配列の受け取...
おすすめ情報