通用方法 - “private <t> boolean(T [],T [])”</t>

时间:2012-05-04 20:30:25

标签: java arrays generics

我对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 个答案:

答案 0 :(得分:4)

泛型仅适用于对象,您必须为基本数组重载方法。 (您可以在其中切换到Integer [],Boolean []等等)

答案 1 :(得分:3)

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

更详细:

Java Generics总是使用类,因此在使用这样的泛型时,需要使用每种类型的类版本。由于Java通过自动装箱自动将int值转换为Integer对象值,因此除了所用类型的名称之外,您的代码实际上应该没有任何区别。

答案 2 :(得分:3)

将数组类型和变量更改为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;
    }
}

答案 3 :(得分:1)

正如其他人所说,泛型只能使用对象,因此从技术上讲,您可以切换到使用Integer[]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