2015-01-04 10 views
8

最近、私はリフレクションで多くのことをしてきましたが、この小さなユーティリティメソッドを実装しました。最初のバージョンはコンパイルされませんが、後者はコンパイルされています。クラスの配列クラスを取得する際に驚くべきコンパイルエラー

はコンパイルされません:

public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) { 
    return Array.newInstance(componentType, 0).getClass(); 
} 

コンパイルとうまく動作します:

public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) { 
    Class c = Array.newInstance(componentType, 0).getClass(); 
    return c; 
} 

つの質問:それが悪いのでしょうか?これを行うより良い方法はありますか?ここで

は最初からコンパイルエラーです:getClass()

TypeUtils.java:[12,60] incompatible types: java.lang.Class<capture#1 of ? extends java.lang.Object> cannot be converted to java.lang.Class<T[]> 

答えて

4

戻り値の型はClass<?>です。

Class<?>Class<T[]>(返信文で)に割り当てていますが、間違っている場合はキャストが必要です。

これは罰金コンパイルします:

@SuppressWarnings("unchecked") // added to suppress compiler warning 
public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) 
{ 
    return (Class<T[]>) Array.newInstance(componentType, 0).getClass(); 
} 

あなたの第二の例では、[OK]を作品生タイプClassを、使用 - 生タイプをキャストすると、暗黙的のようです。しかし、これは推奨されないテクニックなので、コンパイラの警告が表示されます。

Class<?>として適切にパラメータ化すると、キャストも必要になります。

+0

ああ。私はそれを試みましたが、intellijは抑止警告でさえ、まだ動揺していました(inconvertibleタイプについては赤い下線)。私はバグを発見したようだ。 – RutledgePaulV

+0

キャストをお持ちの場合はOKです。おそらく、この種の警告をエラーとして扱うようにIDEを設定しているのでしょうか?私はあなたがEclipseでそれを行うことができることを知っています。 – MightyPork

+0

Hm、この種のエラーでレベルを調整する方法を探しましたが、それを見つけられませんでした。ジェットブレーンズが以前にバグとしてこのようなケース(ここではhttp://youtrack.jetbrains.com/issue/IDEA-105846)を修正したので、私はそれを提出します。 – RutledgePaulV

関連する問題