2016-02-05 20 views
7

次のコードはJDK7でjavacを使用して両方のテストメソッドをコンパイルしますが、JDK8はwillCompileメソッドのみをコンパイルします。Java 7からJava 8へのコンパイルエラー

willNotcompileのエラーがある: "タイプKlasaにおける方法methodClass<T>)は引数(Class)には適用されません。"

@Test 
public void willCompile() throws InstantiationException, IllegalAccessException { 
    Class klass = getObject(Class.class); 
    method(klass); 
} 

@Test 
public void willNotCompile() throws InstantiationException, IllegalAccessException { 
    method(getObject(Class.class)); 
} 

<T> ResponseEntity<T> method (Class<T> klasa) { 
    return new ResponseEntity<T>(HttpStatus.OK); 
} 
public static <T> T getObject(Class<T> clazz) throws IllegalAccessException, InstantiationException { 
    return clazz.newInstance(); 
} 
+1

'willCompile()'はrawtypesを使用していますが、これは古いコード – Ferrybig

+2

[未処理の型とは何ですか?](http://stackoverflow.com/questions/2770321/)でのみサポートされています。どのような - 生 - 型 - と - なぜ - 私たち - それを使用する必要があります) – Tunaki

+1

[入れ子にされた呼び出しと生の種類のターゲットタイピング](http://stackoverflow.com/a/26285613/2711488) – Holger

答えて

5

上記は、rawTypesを使用しているためコンパイルされます。

あなたの方法はClass<T>しか受け付けていませんが、Classとしてください。リフレクションを使用すると、クラスのジェネリック型を指定できないため、getObjectは生のClassオブジェクトを返します。

問題の唯一の修正は戻り値のキャストです。

​​

しかし、この解決策は、あなたがまだあなたがClassの新しいインスタンスを作成することができないという事実の問題を取得する実行時の問題を解決しながら。

JDK 7は、この比較ではあまり厳しくなく、戻りコードClassをコード裏にClass<?>にキャストしたので、コードはコンパイルできました。 Holger JDK 7によれば

は、行全体のためのジェネリックタイプをオフにし、リターン結果にRAW型を使用し、この方法は、Classを取得しResponseEntityを返すことを意味します。

+0

'getObject()'は生のClassオブジェクトを返さず、あるオブジェクトのインスタンスを返します。コンパイルはうまくいきますが(少なくとも警告を与えるべきです)、ランタイムanywyaで失敗します。ありがとう。 –

+0

クラスの新しいインスタンスを作成することはできません(例外がスローされます)。ただし、ランタイムではなくコンパイルルールを確認するのは簡単な実装でした。 – user3364192

+1

実際には、Java 7は 'Class'を' Class 'にキャストしませんでした。操作中に生の型を使用して、式全体のジェネリック型チェックをオフにしました。したがって、入力が生の型である場合、次の使用法でさらに一般的なエラーが発生する可能性があります。 – Holger

関連する問題