5

我对Java中的泛型真的很陌生。我正在尝试创建一个简单的方法来比较两个相同类型的数组,但我想使用通用方法。我在下面附上了一个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

尝试使用 Integer[] 而不是 int[]。

更详细地说:

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

正如其他人所指出的,泛型仅适用于对象,因此从技术上讲,您可以切换到 usingInteger[]Boolean[]

但是,请注意Integer[]Boolean[]扩展Object[]. 使这个方法泛型实际上没有什么好处,因为T总是会被推断为至少是Object. 例如,以下仍然编译:

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 回答