假设我有一个名为 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时,这是一个反复出现的问题。
答案 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
引用指向它们。然后通过检查实际TypeCast
来instance type
{1}} ..
并使getMembers()
的返回类型相同..它会起作用。
通过这种方式,您可以返回List
Member
或extends your Member
类的任何类。并且您不需要明确地给出这些类的名称..
答案 1 :(得分:1)
泛型本质上是invariant
。这意味着List<MemberNio>
不是List<Member>
的子类型
您可以使用wildcards指定边界。
List<? extends Member> which means List of Member or any subclass of Member