このケースは、EclipseのJavaコンパイラがjavacをクラッシュさせる別のケースのようです。私の唯一の質問は、JLSまたはjavacのバグかどうかです。自己参照型と有界ワイルドカードの間の悪い相互作用
interface EndoFunctor< C, FC extends EndoFunctor< C, FC > > { /*...*/ }
interface Algebra< C, FC extends EndoFunctor< ? extends C, FC > > { /*...*/ }
2行目はEclipseでコンパイルされますが、「型パラメータFCがその範囲内にない」というメッセージとともにjavacでコンパイルできません。
FCはEndoFunctorを拡張すると宣言されています<?拡張C、FC>、FC上の境界は、EndoFunctorを拡張することです< D、FC>この場合、推測されたDのために? javacはワイルドカードが両方のコンテキストで同じ未知の型を表していることを認識していないと思います。 Eclipseは、しかし、!
はどうやら次は、javacの問題を回避しています:
interface EndoFunctor< C, FC extends EndoFunctor< ? extends C, FC > > { /*...*/ }
が、これは私がそのインターフェイスに必要よりも緩い定義です。
私も
interface Algebra< C, D extends C, FC extends EndoFunctor< D, FC > >
を試みることができるが、そのアプローチは、どこにでもを通じて、余分な型パラメータDを運ぶために私を強制します。
どうすればよいですか?
使用しているjavacのバージョンは表示されません。 –
申し訳ありません。これはJava 1.6.0_31です。 –