2012-04-03 4 views
6

当社は現在、以下の短縮クラス6. OpenJDKのでコンパイルされません一つのクラスは、このエラーを再現していますジェネリック問題 - 推論タイプ(s)がバインドされた宣言に準拠していない

public class Copy implements ICopy {   
    public <A,B extends List<A>,C extends Map<A,B>> A method(A a, B b) { 
     A something = null; 
     return something; 
    } 

    @Override 
    public <A,B extends List<A>> A method2(A a, B b) { 
     return method(a,b); 
    }  
} 

インターフェースはシンプルです、それだけで私たちはmethod2の署名を変更することはできませんことを、示しています

public interface ICopy {  
    public <A,B extends List<A>> A method2(A a, B b); 
} 

それは神託のJavaバージョンでコンパイルし、7をOpenJDKの - しかし、OpenJDKの6で失敗し、そして、残念ながら、それは我々が持っているバージョンです(元の)コードをコンパイルするために使用します。

エラーメッセージが

Copy.java:15: invalid inferred types for C; inferred type does not conform to declared bound(s) 
inferred: java.util.Map<A,B> 
bound(s): java.util.Map<A,B> 
       return method(a,b); 
          ^

である私に必要なのは、それがコンパイルなるようにmethod2の実装を変更する方法をいくつかのアイデアです。私も...コンパイラの警告を気にしないだろう

+0

はバグのようです。 EclipseコンパイラとSunのコンパイラはこれについて何も言わない。 –

+0

@GuillaumePolet - Javaバージョンのジェネリック型のバグまたは過度の厳密な処理。そして、はい、日食は(ビルドを殺すこの厄介なエラーを再現するにはかなり複雑になった)不平を言っていません。 –

答えて

10

私はこのように、明示的に境界を指定しようとするだろう:

return this.<A,B,Map<A,B>>method(a,b); 

しかし、より一般的に、私はタイプパラメータの必要性が表示されませんCmethodの引数も戻り値の型もCを参照していないので、methodのシグネチャを変更できる場合は、その型パラメータを完全に省略します。

+0

ああ、申し訳ありませんが、これは実際にエラーに焦点を当てた小さなサンプルクラスです。 *実際の*メソッドはすべての型パラメータを使用します。 –

+0

+1と感謝!魅力的な作品! –

関連する問題