5

私はJavaのジェネリックに本当に慣れていません。同じ型になる 2 つの配列を比較する単純なメソッドを作成しようとしていますが、ジェネリック メソッドを使用したいと考えています。以下に MWE を添付しました。

public class MWE {
  public static void main(String[] args){
    int[] test1,test2;
    test1 = new int[2];
    test2 = new int[2];
    checkArray(test1,test2);
  }

  private <T> boolean checkArray(T[] check, T[] test) {
    if(check.length != test.length)
      return false;

    for(int i=0;i<check.length;i++)
      if(check[i]!=test[i])
        return false;

    return true;
  }
}

コンパイルしようとすると、次のようになります。

MWE.java:6: <T>checkArray(T[],T[]) in MWE cannot be applied to (int[],int[])
    checkArray(test1,test2);
    ^
1 error
4

4 に答える 4

5

ジェネリックはオブジェクトに対してのみ機能します。プリミティブ配列のメソッドをオーバーロードする必要があります。(Integer[]、Boolean[]などに切り替えることができます)

于 2012-05-04T20:33:07.883 に答える
4

int[] の代わりに Integer[] を使用してみてください。

さらに詳細に:

Java ジェネリックは常にクラスで動作するため、このようなジェネリックを使用する場合は、各型のクラス バージョンを使用する必要があります。Java はオートボクシングを介して int 値を Integer オブジェクト値に自動的に変換するため、使用する型の名前以外にコードに違いはありません。

于 2012-05-04T20:32:15.873 に答える
4

配列の型と変数をIntegerではなく に変更しますint。また、checkArrayメソッドを静的にします。

public class MWE
{
    public static void main( String[] args )
    {
        Integer[] test1 , test2;
        test1 = new Integer[ 2 ];
        test2 = new Integer[ 2 ];
        checkArray( test1 , test2 );
    }

    private static < T > boolean checkArray( T[] check , T[] test )
    {
        if ( check.length != test.length )
            return false;

        for ( int i = 0 ; i < check.length ; i++ )
            if ( check[ i ] != test[ i ] )
                return false;

        return true;
    }
}
于 2012-05-04T20:35:26.713 に答える
2

Integer[]他の人が指摘したように、ジェネリックはオブジェクトでのみ機能するため、技術的には使用に切り替えることができますBoolean[]

ただし、注意しInteger[]Boolean[]くださいObject[]。このメソッドをジェネリックにしても、実際にはほとんどメリットがありませTObject。たとえば、次のコードは引き続きコンパイルされます。

Integer[] test1 = new Integer[2];
Boolean[] test2 = new Boolean[2];
checkArray(test1,test2);

呼び出し元は、チェックを機能させるために型パラメーターを指定する必要があります。

this.<Integer>checkArray(test1,test2); //compile error
于 2012-05-04T20:38:05.470 に答える