2

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

getMember(id)getMembers方法返回MemberNio对象。我的应用程序层不需要了解 Nio 的任何内容,只需调用getMember方法来获取成员并使用超类型 Member:

Member member = membersMgr.getMember(id);

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

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

这将迫使我拥有MemberNio对象,而我应该只知道Member对象。

当我使用列表和接口/支持类型时,这是一个反复出现的问题。

4

2 回答 2

6

您可以使用: -

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

为了获取membersusing enhanced-for loop,我们使用了 :- 的概念Super type Reference pointing the Subclass object。因此,无论subclass在. list_super-classTypeCastinstance type

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

这样您就可以返回该类ListMember任何extends your Member类..并且您不需要明确给出这些类的名称..

于 2012-09-26T17:23:46.587 回答
1

泛型是invariant自然的。这意味着它 List<MemberNio>不是List<Member> 您可以使用通配符指定边界的子类型。

 List<? extends Member> which means List of Member or any subclass of Member
于 2012-09-26T17:26:58.713 回答