Java OO设计:接口和列表

时间:2012-09-26 17:20:48

标签: java list interface

假设我有一个名为 MemberNio 的类(包含SocketChannel和其他特定于nio的对象),它扩展了 成员 上课。

方法 getMember(id) getMembers 返回 MemberNio 对象。 我的应用程序层不需要知道任何有关Nio的东西,只需调用 getMember 方法来获取成员并使用超类型成员:

Member member = membersMgr.getMember(id);

但是当我尝试调用 getMembers 时出现问题:

List<Member> members =  membersMgr.getMembers(); // <- error, can't cast List<MemberNio> to List<Member>

这会迫使我拥有 MemberNio 对象,我只能知道 会员 对象。

当我使用Lists和Interfaces / suptypes时,这是一个反复出现的问题。

2 个答案:

答案 0 :(得分:6)

您可以使用: -

List<? extends Member> members =  membersMgr.getMembers();
for (Member member: members) {
     if (member instanceof MemberNio) {
          MemberNio memNio = (MemberNio)member;
          /** Do your stuff **/
     }
} 

要使用members获取enhanced-for loop,我们使用了以下概念: - Super type Reference pointing the Subclass object。因此,无论subclass中存储了哪些list个对象,我们始终使用super-class引用指向它们。然后通过检查实际TypeCastinstance type {1}} ..

并使getMembers()的返回类型相同..它会起作用。

通过这种方式,您可以返回List Memberextends your Member类的任何类。并且您不需要明确地给出这些类的名称..

答案 1 :(得分:1)

泛型本质上是invariant。这意味着List<MemberNio>不是List<Member>的子类型 您可以使用wildcards指定边界。

 List<? extends Member> which means List of Member or any subclass of Member