2012-03-30 10 views
3

このケースは、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を運ぶために私を強制します。

どうすればよいですか?

+0

使用しているjavacのバージョンは表示されません。 –

+0

申し訳ありません。これはJava 1.6.0_31です。 –

答えて

1

どうすればよいですか?

ここにいくつかの実用的な解決策があります。

  • は、Java 7の最新のパッチ・リリースからjavacを使用してみてください、私は唯一のJava 7で固定したJava 6の内の特定のjavacコンパイラのバグの公聴会を思い出す...しかし、私は、リストのか分かりません。 (そして、Java Bugs Databaseは検索することができません...)

  • 2つの選択肢のうち1つを使用して、すでに「仕事」を見つけました。

+0

はい、新しいjavac(例:openjdk 8)がOPのコードをかなりコンパイルします – charlie