1

次のコードを書いているときに、 It is in netbeans の行で問題が発生します。配列宣言が受け入れられるかどうか。受け入れられた場合、なぜ例外

      Exception in thread "main" java.lang.RuntimeException: Uncompilable source code generic array creation
            at mygenerics.Addition.<init>(MyGenerics.java:26)
at mygenerics.MyGenerics.main(MyGenerics.java:16)
    Java Result: 1

プログラムはこちら

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
 */
package mygenerics;

/**
 *
 * @author SUMIT
 */

public class MyGenerics {

public static void main(String[] args)
{
    Addition<Integer> ints = new Addition<>(1,2,3);
    ints.sum();
    Addition<Double> dbls = new Addition<>(1.25,2.68,3.49);
    dbls.sum();
    System.out.println(ints.toString());
}

}
class Addition<T extends Number>
{
    **T arr[]=new T[10];**
public Addition(T... values)
{
   for(int j=0;j<values.length;j++)
   {
       int i=0;
       arr[i]=values[j];
       i++;
   }
   System.out.println(arr);
}
public <T extends Number> void sum()
{
    T sum;
    System.out.print(arr);
    for(int i = 0;i<arr.length;i++)
    {
      **sum = sum + this.arr[i];**
    }

}
}

Generics Array作成エラーが発生しました

4

2 に答える 2

2

TGeneric 配列を Java で直接作成することはできません。Java は実行時にコンポーネントの型を認識している必要がありますが、型消去によるジェネリックは実行時に型を認識していないためです。

T[] genericArray = (T[]) new Object[];

より良い方法は次のとおりです。

// Use Array native method to create array of a type only known at run time
T[] genericArray  = (T[]) Array.newInstance(componentType,length);

最初の方法は弱い型付けを使用します。引数として渡されたオブジェクトに対してチェックは実行されません。2 番目の方法は厳密な型指定を使用します。別のクラスの引数を渡そうとすると例外がスローされますが、配列を作成する前に実行時にコンポーネントの型を知っておく必要があります。

于 2013-09-03T06:23:34.667 に答える
1

Java でジェネリック配列を作成する最良の (型安全な) 方法は次のとおりです。

    T[] result= (T[])Array.newInstance(ElementType.class,size);

コードに適用すると、次のようになります。

    public Addition(Class<T> cls,T... values) {
        this.arr= (T[])Array.newInstance(cls,10);
        ...
    }

そして、次のように呼び出します。

    Addition<Integer> ints= new Addition<>(Integer.class,1,2,3) ;
    Addition<Double> dbls= new Addition<>(Double.class,1.25,2.68,3.49) ;

フォーム:

    T[] result= (T[])new Object[size] ;

通常は機能しません

于 2013-09-03T06:38:43.783 に答える