質問1
class A {}
class B extends A {}
A aObj = new A();
B bObj = new B();
以下では、実行時にクラスキャスト例外が発生することがわかっています。
List<B> list_B = new ArrayList<B>();
list_B.add((B)aObj); //ClassCast exception
しかし
List<? extends A> list_4__A_AND_SubClass_A = new ArrayList<B>();
List<A> list_A = (ArrayList<A>)list_4__A_AND_SubClass_A;
list_A.add(aObj); // No exception here, Why?
質問2
以下のような方法で
void method(List<? extends A> list_4__A_AND_SubClass_A){
//How do i find the passed list is of Type A or B ??
// To decide List<A> list_A = (ArrayList<A>)list_4__A_AND_SubClass_A;
// OR List<B> list_B = (ArrayList<B>)list_4__A_AND_SubClass_A;
}
アップデート
Q_1
変更のために以下のようなコレクションを参照することは避けたほうがよいでしょう。渡されたリストが A/B のタイプであると確信している場合を除きます。そのリストの整合性を維持するために。
List<A> list_A = (ArrayList<A>)list_4__A_AND_SubClass_A;
Q_2
呼び出し元メソッドから呼び出し元メソッドにもう 1 つの引数を渡して、呼び出し元メソッドでの変更中にリストの整合性を維持できると思います。
void method(List<? extends A> list_4__A_AND_SubClass_A, Class<? extends A> obj){
if (A.class.isAssignableFrom(obj)) {
List<A> list_A = (List<A>)list_4__A_AND_SubClass_A;
list_A.add(new A());
list_A.add(new B());
} else if (B.class.isAssignableFrom(obj)){
List<B> list_B = (List<B>)list_4__A_AND_SubClass_A;
//list_B.add(new A()); //only we can add B
list_B.add(new B());
}
}