2009-05-04 2 views
1

インタフェースMyThingのリストであるインタフェースMyListを定義します。 MyListのセマンティクスの一部は、その操作がMyThingインターフェイスを実装していないオブジェクトに何の意味も持たないことです。generic interface:特定のもののリスト

これは正しい宣言ですか?

interface MyList<E extends MyThing> extends List<E> { ... } 

編集:今、私はその方法の一つとして、マイリストを返す別のインターフェイスを持って(パート2)。

// I'm defining this interface 
// it looks like it needs a wildcard or template parameter 
interface MyPlace { 
    MyList getThings(); 
} 

// A sample implementation of this interface 
class SpecificPlace<E extends MyThing> implements MyPlace { 
    MyList<E> getThings(); 
} 

// maybe someone else wants to do the following 
// it's a class that is specific to a MyNeatThing which is 
// a subclass of MyThing 
class SuperNeatoPlace<E extends MyNeatThing> implements MyPlace { 
    MyList<E> getThings(); 
    // problem? 
    // this E makes the getThings() signature different, doesn't it? 
} 

答えて

2

はい、少なくともそれはどのようにEnumSetですか。パート2への回答で

public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>


編集:

私はなぜインタフェースでgetThings()の戻り値の型は、生タイプの文句はありませんか分かりません。私は、型の消去のために、インタフェース内の警告は、たとえそこにあっても役に立たないと考えています(戻り値の型をListに変更すると警告はありません)。

2番目の質問では、MyNeatThingMyThingに拡張されているため、Eはその範囲内です。これは汎用パラメータでバインドされたextendsの使用のポイントのようなものですか?

+0

リストは消費者であり、私たちはスーパーを使用するはずでしたか? – willcodejavaforfood

+0

クラス型のパラメータ宣言でsuperを使用することはできません。そのため、答えを把握する手間が省けます。 ;) –

+0

私はあなたが2つの問題を混乱させていると思いますが、わかりません。私はあなたがSomeClass を見たとは思わない。 SomeClass <?が表示されることがあります。その型がメソッドの引数を指定するために使用されるときはsuper Something>。 http://www.ibm.com/developerworks/java/library/j-jtp07018.html –

1

パート1では、正しく見えます。

あなたのパート2では、次のようなことをお勧めします。このメソッドはMyListを返しますが、その内容はわかりません(実装が異なると明らかに異なります)が、MyThingのサブタイプであることがわかります。

interface MyPlace { 
    MyList<? extends MyThing> getThings(); 
} 
0

正しく java.util.Listにのようなインタフェースを実装することは困難であることに留意してください。そう自分でこれらの質問のすべてを尋ねる:

  • 私はjava.util.Listのを使用することができます「とはされて」、私は機能を追加/削除する必要が していますか?
  • Iterable <T>のような実装が簡単なものはありますか?
  • 構図を使うことはできますか? (継承対)
  • Google のような既存のライブラリで、新たに求められる機能が であることがありますか?
  • 機能を追加/削除する必要がある場合、追加の複雑さは になりますか?

つまり、おそらくjava.utilを使用できます。あなたの例のリスト:

interface MyPlace<T extends MyThing> { 
    List<T> getThings(); 
} 

class SpecificPlace implements MyPlace<MyThing> { 
    public List<MyThing> getThings() { return null; } 
} 

class SuperNeatoPlace implements MyPlace<MyNeatThing> { 
    public List<MyNeatThing> getThings() { return null; } 
} 
+0

ああ、もちろん:私はちょうどこれらのほとんどのために内部のプライベートリストに委任するつもりです。 –

+0

質問はそれのリストの側面についてではなく(リストをFooと置き換え、私の質問は同じままですが)ジェネリックの面についてです。 –

関連する問題