Java には具体化されたジェネリックはありません。リストは、実行時にその要素の型を保持しません。したがって、制限付きの型にキャストしようとすると、警告が表示されます。型を知っていると思うかもしれませんが、コンパイラはそれが間違っている可能性があることを思い出させます。
バインドされていないコレクションにキャストしてから、個々の要素の型を確認できます。
List<?> tmp = (List<?>) session.getAttribute("qList");
if (tmp != null) {
for (Object o : tmp) {
Question q = (Question) o;
/* Use q ... */
}
}
一部の API に を渡す必要がある場合はList<Question>
、要素をループ内で正しく宣言された新しいリストにコピーできます。明らかに、これはユーティリティ メソッドに含める必要がある多くの混乱です。しかし、柔軟にするために、おそらく動的型キャストを使用したいと思うでしょう。
public static <T> List<T> asList(Collection<?> c, Class<? extends T> type) {
if (c == null)
return null;
List<T> list = new ArrayList(c.size());
for (Object o : c)
list.add(type.cast(o));
return list;
}
List<Question> qList = asList((Collection<?>) session.getAttribute("qList"), Question.class);
java.util.Collections
には、必要なことをほぼ実行するメソッドがあります。残念ながら、元のラップされたコレクション内の要素の型はチェックされません。また、新しい独立したコレクションを作成するのではなく、基になるコレクションをラップするため、型エラーが発生する可能性があります。
幸いなことに、2 番目の質問は簡単です。
List<ExamSchedule> eList = new ArrayList<>();