2016-08-18 21 views
4

私は推論入力するJDK8のおかげ下罰金コンパイルされている次のコードを実行しようとしています:CBは、[Ljava.langにキャストすることはできません。これは、ClassCastExceptionがスローランニング、しかしJDK8型推論問題

public static <A,B> B convert(A a) { 
    return (B) new CB(); 
} 
public static void main(String[] args) { 
    CA a = new CA(); 
    CB b = convert(a); //this runs fine 
    List<CB> bl = Arrays.asList(b); //this also runs fine 
    List<CB> bl1 = Arrays.asList(convert(a)); //ClassCastException here 
} 

を.ObjectしかしCB b = convert(a)はうまく動作します。

理由は何ですか?

+3

待って、何を変換していますか?引数は無視されるので、渡される内容は関係ありません。 – Carcigenicate

+1

どのJREバージョンを使用していますか?私は1.8.0_92で 'java.lang.VerifyError:オペランドスタック上の不正な型 'を取得します。 Btwは私のために働いています:リスト bl1 = Arrays.asList(テスト。 convert(a)); ' –

+1

@StefanZobel確かに動作しますが、私は約150の使用法を持っていて、手動で変更するのは簡単ではありません - 私はJDK8が自動的に推論を行うことを望んでいた –

答えて

3

発信者が望むものを返すことを約束する署名を持つジェネリックメソッドを作成するときはいつでも、トラブルを求めています。コンパイラから「未チェック」の警告が出ているはずです。これは基本的には:予期しないClassCastExceptionが発生する可能性があります。あなたはそれと互換性のある可変引数のパッケージを(必要としないメソッド呼び出しを好むため、コンパイラは、実際に、私の知る限り

List<CB> bl1 = Arrays.asList(YourClass.<CA,CB[]>convert(a)); 

を推測するのに対し、コンパイラは

List<CB> bl1 = Arrays.asList(YourClass.<CA,CB>convert(a)); 

を推測することを期待

事前バリエーションコード)。

convertメソッドが予想される配列型を返さないため、これが失敗します。