2016-03-25 9 views

答えて

13

これは、ジェネリックタイプTが何であるかを特定していないためです。したがって、デフォルトでは、Tは数値ではなくオブジェクト型であると考えられます。オブジェクトをダブルにキャストすることはできませんが、これは意味がありません。

<T extends Number>に変更するとうまくいくはずです。ただし、int配列ではなくInteger配列を持つ必要があるかもしれません。

+0

指定された配列がInteger []ではなくint []である場合、それを動作させる方法はありますか? – xmllmx

+0

''がうまくいくと言っていいでしょう。 +1 –

+8

@xmllmx 'int'はオブジェクト型ではないプリミティブ型なので、動作しません。 – Satya

-2

Javaコンパイラは、ジェネリックコードのすべての型パラメータを消去します。これの直接的な結果は、ジェネリックのどのパラメータ化タイプが現在使用されているのかを検証できないことです。テストすると、instanceofも動作しません。実行時はJavaの型パラメータを追跡しないため、とHashSet<Double>の間に違いはありません。最大で..instanceof HashSet<?>を実行して、それがHashSetのインスタンスであるかどうかを調べることができます。

私が書いたことで何かが明確でない場合は、docsを参照してください。

+1

この回答は正しいですが、私はそれが質問に答えるのを見ません。 –

15

問題はこれより深いです。あなたが強調した行がなくても、このプログラムは壊れています:

public class Main { 
    public static <T> void foo(T[] bar) { 
     // do nothing 
    } 

    public static void main(String[] args) { 
     int[] int_buf = new int[8]; 
     foo(int_buf); <-- problem is here 
    } 
} 

Javaジェネリックのみがタイプパラメータとして参照型をサポートしています。次のようにジェネリックメソッドfoo()を書き換えることができます

<T extends Object> void foo(T[] bar) { ... } 

そしてここでは、あなたの問題です:Objectint[]T[]なるようにする拡張何Tはありません。

二次的に、変換が失敗する理由は、Tについては何も知らないため、Tからdoubleへの変換が存在することはわかりません。

関連する問題