使用界面使用对象填充列表

时间:2016-06-03 13:28:22

标签: java hibernate arraylist interface abstract

好的,所以我在JSF和Hibernate中有一个任务,我必须从下拉菜单中获取一个对象列表,具体取决于用户从网页中选择的消息类型。

现在,用户可以选择的所有可能类型的对象(当我说对象我指的是java类时)都实现了一个接口,我们称之为AbstractMessage

所以我的课程A实施AbstractMessage,课程B实施AbstractMessageCD等。

现在我的选择是,从下拉列表中选择每个案例有很多类型为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转换为ABC类型列表?

我尝试在不初始化的情况下声明列表,我尝试了转换,但它不起作用。必须有一些非常简单的解释。感谢。

1 个答案:

答案 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);