2017-04-10 19 views
2

コードサンプルから始めましょう。これを行うことができればと思います。Javaのジェネリックは、C <T extends MyClass <Z>>メソッドはZを返す必要があります

MyOtherClassは、一般的な

class MyOtherClass<Z>{} 

ですので、私は、MyOtherClass

class C<T extends MyOtherClass<Z>> { 
    Z myTypeOfReturnMethod() { return doStuff(); } 
} 

あいにくのZを取得したいと思い、私の知る限り、私が指定することはできませんし、唯一の有効な文法だろうbe

class C<T extends MyOtherClass> { 
    ???MyOtherClass.Z??? myTypeOfReturnMethod() { return doStuff(); } 
} 

これを行うにはどうすればよい方法がありますか? Cは2つのジェネリックを持つことができますが、それは一種の繰り返しでエラーが発生しやすいです。

class C<Z, T extends MyOtherClass<Z>> { 
    // ... 
} 

これは1があなたのtypedeclarationsの冗長性として認識する可能性が何かを意味しますが、少なくともあなたを実際:

答えて

3

「単純な」解決策は、明示的にそうようにそれを導入することにより、追加のタイプの制約についてのjavaを伝えることですあなたが望むものを手に入れよう...

他のすべてのものはJavaによって意味的にサポートされていません.T型のTypeBoundにあるZは型パラメータとして(JLS 8.1.2の意味で)アクセスできませんが、TypeBound 。 Zを使用する場所は、Zについてはまだ分かりません。これは、タイプパラメータとして明確に導入されていないため、消去されるためです。これは、特に、myTypeOfReturnMethodの署名がObjectに変更された場合でもコンパイルエラーが発生することによって証明されます。結果はまだです:

に加えて
error: cannot find symbol 
    class C<T extends MyOtherClass<Z>> { 
           ^
symbol: class Z 

あなたはおそらく実際に欲しいものは「さらに多くの冗長」何かであること、すなわち(せき)、:

実際にある
class C<Z, T extends MyOtherClass<? extends Z>> { 

非常にいくつかのSOの質問とJLSで概説された理由のために上記とは非常に異なります。

+2

これはなぜ冗長になるのでしょうか。 – shmosel

+0

@shmosel調整された処方といくつかの情報を追加;) – Vogel612

+3

まだそれは非常に冗長だとは思わない。そして私は ''お勧めしません? 'Z 'が[PECS](http://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super)に従ってプロデューサーであることが明らかでない限り、Zを延長する。 – shmosel

関連する問題