2

Memberクラスを拡張するMemberNio (SocketChannel およびその他の nio 固有のオブジェクトを含む) というクラスがあるとします。

メソッド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>

これにより、 Memberオブジェクトについてのみ知る必要があるMemberNioオブジェクトが必要になります。

これは、リストとインターフェイス/サップタイプを扱うときに繰り返し発生する問題です。

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()同じにします..うまくいくでしょう。

Listそうすれば、そのクラスのMemberまたは任意のクラスを返すことができ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 に答える