好的,所以我在JSF和Hibernate中有一个任务,我必须从下拉菜单中获取一个对象列表,具体取决于用户从网页中选择的消息类型。
现在,用户可以选择的所有可能类型的对象(当我说对象我指的是java类时)都实现了一个接口,我们称之为AbstractMessage
。
所以我的课程A
实施AbstractMessage
,课程B
实施AbstractMessage
,C
,D
等。
现在我的选择是,从下拉列表中选择每个案例有很多类型为A,B,C,D等的列表,或者使用一个类型为AbstractMessage
的列表。
当用户选择一种类型时,例如A
,此AbstractMessage
列表将成为类型A的列表。至少,这就是想法 - 只使用一个类型为AbstractMessage
的列表而不是大量的A
B
C
等类型的列表
问题是 - 我该怎么做?我已经将我的抽象列表声明如下:
private List<AbstractMessage> abstractList = new ArrayList<AbstractMessage>();
如何使此列表成为“A”,“B”,“C”类型的列表(取决于if-else语句的结果,我已经拥有)?
所有内容都已到位,但我不知道如何将abstractList
转换为A
,B
,C
类型列表?
我尝试在不初始化的情况下声明列表,我尝试了转换,但它不起作用。必须有一些非常简单的解释。感谢。
答案 0 :(得分:1)
您可以使用有界通配符:
List<? extends AbstractMessage> list;
...
list = new ArrayList<A>();
...
AbstractMessage var1 = list.get(0);
A var2 = (A) list.get(0);
List<A> list2 = (List<A>) list;
list2.add(new A());
A var3 = list2.get(0);
或者,如果您只想从列表中获取AbstractMessage
类型的对象:
List<AbstractMessage> abstractList = new ArrayList<>();
...
abstractList.add(new A());
AbstractMessage var1 = abstractList.get(0);
A var2 = abstractList.get(0); // <-- Compiler error
A var3 = (A) abstractList.get(0);
...
List<A> list2 = new ArrayList<>();
...
abstractList.addAll(list2);