Java OO设计:接口和列表

Mat*_*hew 2 java interface list

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

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

Member member = membersMgr.getMember(id);
Run Code Online (Sandbox Code Playgroud)

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

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

那将迫使我拥有MemberNio对象,我应该只知道Member对象.

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

Roh*_*ain 6

您可以使用: -

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

为了获取members使用enhanced-for loop,我们使用了以下概念: - Super type Reference pointing the Subclass object.所以,无论subclass存储在哪个对象中list,我们总是使用super-class引用指向它们.然后TypeCast通过检查实际的相应instance type...

并使返回类型getMembers()相同..它会工作.

这样,你可以返回ListMember或任何类,extends your Member类..而且你也不需要给这些类的名称明确..